如何防止安卓相机意图保存捕获的图像两次



我正在做一个从用户那里拍照然后做一些image processing的项目。我正在使用此代码捕获用户照片:

private static final int TAKE_PICTURE = 1;
private Uri imageUri;
public void takePhoto(View view) {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    File photo = new File(Environment.getExternalStorageDirectory()+"/glasses/",  "temp.png");
    intent.putExtra(MediaStore.EXTRA_OUTPUT,
            Uri.fromFile(photo));
    imageUri = Uri.fromFile(photo);
    startActivityForResult(intent, TAKE_PICTURE);
}

它工作正常,但问题是照片在两个不同的目录中保存了两次:

    /
  1. 存储/仿真/0/DCIM/相机
  2. /
  3. 存储/模拟/0/眼镜

如何防止相机意图将捕获的图像保存到相机基目录?

提前谢谢。

有一个选项,您必须从默认位置删除最后拍摄的照片:

我认为这可能会对您有所帮助:-

  private void deleteLastPhotoFromGallery() {
        String[] projection = new String[] {
                MediaStore.Images.ImageColumns._ID,
                MediaStore.Images.ImageColumns.DATA,
                MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME,
                MediaStore.Images.ImageColumns.DATE_TAKEN,
                MediaStore.Images.ImageColumns.MIME_TYPE };
        final Cursor cursor = getContentResolver().query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, 
                                null,null, MediaStore.Images.ImageColumns.DATE_TAKEN + "  
                                DESC");
        if (cursor != null) {
            cursor.moveToFirst();
            int column_index_data =  
                        cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                         String image_path = cursor.getString(column_index_data);
            File file = new File(image_path);
            if (file.exists()) {
                file.delete();
}
}
}

这是从DCIM文件夹中删除最新图像的代码

private void deleteLatest() {
    File f = new File(Environment.getExternalStorageDirectory() + "/DCIM/Camera");
    File[] files = f.listFiles();
    Arrays.sort(files, new Comparator < Object > () {
        public int compare(Object o1, Object o2) {
            if (((File) o1).lastModified() > ((File) o2).lastModified()) {
                return -1;
            } else if (((File) o1).lastModified() < ((File) o2).lastModified()) {
                return 1;
            } else {
                return 0;
            }
        }
    });
    files[0].delete();
}

你不应该删除任何内容。这是适得其反的。

您的代码现在执行以下操作:- 你为相机应用提供 Uri,相机应用将图像的小副本保存到该 URI,同时将大副本保存到相机文件夹本身。

需要更改代码,以便"相机"应用将全尺寸图像保存到 Uri,而不保存图像本身。

这是通过以下方式完成的:

intent.setClipData(imageUri);
intent.setFlags (Intent.FLAG_GRANT_URI_READ_PERMISSION | Intent.FLAG_GRANT_URI_WRITE_PERMISDION);

并且不要使用:

intent.putExtra(...)

如果您使用Android 6.0或更高版本,则可能会遇到另一个问题:相机应用程序将抛出SecurityException,尝试将图像写入图像Uri。在这种情况下,您需要使用文件提供程序

当你

调用ACTION_IMAGE_CAPTURE时,没有办法保证任何事情。我的意思是,您无法知道哪个应用程序将启动,并且它可能不是100%兼容的,或者有缺陷,或者故意做某事。

用户可以自由使用其设备上预装的相机应用程序(大多数 ODM 选择提供他们的自定义应用程序),或者从 Play 商店下载另一个相机应用程序或旁加载它。即使应用程序符合所有规范,它也完全有权将捕获的文件存储在设备上的任何位置或多个位置 - 这仅取决于应用程序具有的系统权限。

最重要的是,你删除了对自己的回答是正确的。如果您想更好地控制设备相机,则值得捆绑自定义相机实现。您可以依靠开源库(例如 https://android-arsenal.com/tag/141)来开始使用。

最新更新