我正在做一个从用户那里拍照然后做一些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);
}
它工作正常,但问题是照片在两个不同的目录中保存了两次:
/
- 存储/仿真/0/DCIM/相机
/- 存储/模拟/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)来开始使用。