2017-10-09 124 views
1

我工作的一个项目,该项目采取的照片从用户然后做一些image processing。 ,我使用此代码来捕获用户的照片:如何防止android相机意图保存拍摄的图像两次?

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. /存储/模拟/ 0 /眼镜

如何防止相机从意向保存拍摄的图像的相机基本目录?

在此先感谢。

+0

因为您正在将图片保存在您的代码中。 –

+0

@MuhammadTufail是的,我保存图像做一些图像处理,我想保存在一个目录! –

+0

一个目录是指哪个目录? – Champandorid

回答

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(); 
} 
} 
} 
+0

感谢Champandorid的回答,伟大的想法,但两个问题 1文件不会被删除 2 - 为什么从第一个到库保存的,如果我救了它在目录 –

+0

只是因为首先相机保存该图像到默认的目录,然后眼镜您的自定义目录。 – Champandorid

+0

好吧谢谢,但是当我尝试你的代码,它似乎图像被删除,但不删除它显示黑色的照片,而不是 –

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(); 

} 
+0

感谢您的回答,但与@Champandorid一样制作新的黑色图像 –

0

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

您的代码现在可以执行以下操作: - 您将相机应用程序与相机应用程序一起保存照片应用程序的小型副本,同时将大型副本保存到相机文件夹本身。

你需要改变你的代码,使相机的应用程序保存到您的乌里全尺寸图像不保存图像本身。

这是通过:

intent.setClipData(imageUri); 

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

,不要使用:

intent.putExtra(...) 

有可能是,如果你使用Android 6.0或更高版本,你可能会面临另一个问题:相机应用将引发SecurityException尝试将图像写入您的imageUri。在这种情况下,你需要使用FileProvider

0

没有办法保证任何当你调用ACTION_IMAGE_CAPTURE。我的意思是,你无法知道哪个应用程序会开始,并且它可能不是100%兼容的,或者是有问题的,或者是有意的。

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

底线是,your deleted answer to yourself是正确的。如果您想更好地控制设备摄像头,那么捆绑您的自定义摄像头实施是值得的。您可以依赖开源库(例如https://android-arsenal.com/tag/141)开始。

相关问题