【发布时间】:2015-12-18 22:33:02
【问题描述】:
我正在尝试找出拍照后从相机获取文件路径的正确方法:
启动相机意图。因为我告诉相机写入内部存储,所以给它 uri 和读取权限:
File file = new File(context.getFilesDir(), "picture.jpg");
Uri uri = FileProvider.getUriForFile(getApplicationContext(), "my.app.package.fileprovider", file);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivityForResult(intent, ACTION_IMAGE_CAPTURE_REQUEST_CODE);
监听相机意图结果:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != RESULT_OK) {
return;
}
switch (requestCode) {
case ACTION_IMAGE_CAPTURE_REQUEST_CODE:
// How do I get the local path to the file here?
break;
}
}
在相机意图返回时获取文件路径的最佳方法是什么。当然我可以在启动意图之前将文件路径保存到成员变量,但这似乎很糟糕,似乎我应该从 onActivityResult 获取路径。
我已经试过了(Get Image path from camera intent):
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(MediaStore.Images.Media.INTERNAL_CONTENT_URI,projection, null, null, null);
int column_index_data = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToLast();
String imagePath = cursor.getString(column_index_data);
唯一的区别是我正在使用 INTERNAL_CONTENT_URI 因为我试图在内部存储图片。如果我这样做,我会得到一个例外:
获取数据列时出错
java.lang.IllegalArgumentException:列“_data”不存在
我是不是搞错了。我想拍一张照片并将这张照片存储在内部存储器中。
编辑:
再想一想。我应该在内部存储照片吗?我是对的,不是因为新的 android M 权限。我已经必须向用户询问相机权限,如果我将图片存储到外部存储,我必须询问用户是否允许写入外部。最后,如果我将图像存储在外部,则设备上所有可以从外部存储读取的应用程序都可以读取它。这可能是我的应用程序的隐私问题。
【问题讨论】:
标签: android android-camera uri android-camera-intent