如何防止Android摄像头意图两次保存捕获的图像?

时间:2017-10-09 06:00:22

标签: android android-intent camera android-camera-intent

我正在开发一个项目,用来拍摄用户的照片然后做一些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 /眼镜
  4.   

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

提前致谢。

4 个答案:

答案 0 :(得分: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();
}
}
}

答案 1 :(得分:0)

这是从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();

}

答案 2 :(得分:0)

你不应该删除任何东西。这会适得其反。

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

您需要更改代码,以便相机应用程序将Uri保存为完整尺寸的图像而不保存图像本身。

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

intent.setClipData(imageUri);

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

不要使用:

intent.putExtra(...)

如果您使用的是Android 6.0或更新版本,可能会遇到另一个问题:相机应用会在尝试将图像写入您的imageUri时抛出SecurityException。在这种情况下,您需要使用FileProvider

答案 3 :(得分:0)

当您调用 ACTION_IMAGE_CAPTURE 时,无法保证任何。我的意思是,你不知道哪个应用程序会启动,它可能不是100%兼容,或者是错误的,或者是故意做某事。

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

底线是,your deleted answer to yourself是正确的。如果您想要更好地控制设备相机,那么将自定义相机实现捆绑在一起是值得的。您可以依赖开源库(例如https://android-arsenal.com/tag/141)来开始使用。