Android 通过Intent.ACTION\u PICK将拾取的图像复制到文件

Android 通过Intent.ACTION\u PICK将拾取的图像复制到文件,android,Android,我的代码允许用户使用Intent.ACTION\u点击按钮选择图像: public void onClick(视图v){ 意向照片采集器内容=新意向(意向.行动\u采集器); photopickerinent.setType(“image/*”); startActivityForResult(照片采集器内容,选择照片); }您需要实现onActivityResult,当用户从其库中拾取照片后,您的活动从恢复时将调用该功能 意图数据将是一个Uri,您需要提取磁盘上映像的绝对路径 大概是这样的:

我的代码允许用户使用Intent.ACTION\u点击按钮选择图像:

public void onClick(视图v){
意向照片采集器内容=新意向(意向.行动\u采集器);
photopickerinent.setType(“image/*”);
startActivityForResult(照片采集器内容,选择照片);

}
您需要实现
onActivityResult
,当用户从其库中拾取照片后,您的活动从恢复时将调用该功能

意图数据将是一个
Uri
,您需要提取磁盘上映像的绝对路径

大概是这样的:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == SELECT_PHOTO  && resultCode == Activity.RESULT_OK) {
        File file = getBitmapFile(data);
        if(file != null) {
          // do something with the file
        }
    }
}


public File getBitmapFile(Intent data) {
  Uri selectedImage = data.getData();
  Cursor cursor = getContentResolver().query(selectedImage, new String[] { android.provider.MediaStore.Images.ImageColumns.DATA }, null, null, null);
  cursor.moveToFirst();

  int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
  String selectedImagePath = cursor.getString(idx);
  cursor.close();

  return new File(selectedImagePath);
}
如果您的用户在手机上启用了Picassa(或任何其他基于云的照片服务),操作系统可能会允许他们从该来源选择图像。问题是,这样做的结果不符合
getBitmapFile
中的逻辑-也就是说,这与拾取本地文件不同。要解决此问题,您可以确保您的选取器仅允许本地文件:

photopickerinent.putExtra(仅限Intent.EXTRA\u LOCAL\u,true)

要将位图存储到另一个文件,您还需要两种方法:

private boolean writeBitmapToFile(Bitmap bitmap, File destination) {
    FileOutputStream out = null;
    try {
        out = new FileOutputStream(destination);
        return bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
    } catch (Exception ex) {
        Log.i(TAG, String.format("Error writing bitmap to %s: %s", destination.getAbsoluteFile(), ex.getMessage()));
        return false;
    } finally {
        try {
            if (out != null) {
                out.close();
            }
        }catch (IOException ex) {}
    }
}

private File createImageFile() throws IOException {
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(imageFileName, ".jpg", storageDir);
    return image;
}
要使用这些方法:

private boolean writeBitmapToFile(Bitmap bitmap, File destination) {
    FileOutputStream out = null;
    try {
        out = new FileOutputStream(destination);
        return bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
    } catch (Exception ex) {
        Log.i(TAG, String.format("Error writing bitmap to %s: %s", destination.getAbsoluteFile(), ex.getMessage()));
        return false;
    } finally {
        try {
            if (out != null) {
                out.close();
            }
        }catch (IOException ex) {}
    }
}

private File createImageFile() throws IOException {
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(imageFileName, ".jpg", storageDir);
    return image;
}

writeBitmapToFile(位图,createImageFile())

我想将此选定图像以Uri的形式存储到一个临时文件中,该临时文件是使用image=file.createTempFile(imageFileName、/*前缀/“.jpg”、/suffix/storageDir/directory*/)创建的;谢谢你,科迪。我正在寻找writeBitmapToFile()函数。