我想找出拍摄照片后从相机获取文件路径的正确方法:
启动相机意图。因为我告诉相机写入内部存储器给它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;
}
}
获取相机意图返回的文件路径的最佳方法是什么。当然,我可以在启动intent之前将文件路径保存到成员变量,但这看起来很糟糕,似乎我应该从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,因为我试图在内部存储pic。如果我这样做,我会得到一个例外:
获取数据列时出错 java.lang.IllegalArgumentException:column' _data'不存在
我是不是错了。我想拍一张照片并将照片存储在内部存储空间中。
编辑:
还有一个想法。我应该在内部存储照片吗?我是对的,不是因为新的Android M权限。我已经要求用户获得Camera权限,如果我将pic存储到外部存储器,我必须要求用户允许写入外部。最后,如果我在外部存储图像,则设备上可以从外部存储读取的所有应用程序都可以读取该图像。这可能是我的应用的隐私问题。
答案 0 :(得分:0)
在相机意图返回上获取文件路径的最佳方法是什么
您在EXTRA_OUTPUT
中指定了文件路径。相机将照片放在那里,或者没有。如果是,那么您已经知道文件路径:new File(context.getFilesDir(), "picture.jpg")
。在绝大多数情况下应该是这种情况。
有些相机应用程序有问题,会忽略EXTRA_OUTPUT
。在那些情况下:
您可以查看相机应用是否在传递给Uri
的{{1}}中返回Intent
,然后使用onActivityResult()
和ContentResolver
开始将图像复制到所需位置的过程,或
您可以查看openInputStream()
额外是否存在,在这种情况下,您可以将"data"
缩略图保存到所需位置。
在所有这些情况下,文件路径都是您指定的;这只是一个问题,你是否需要额外的工作来获得图像。
当然,我可以在启动intent之前将文件路径保存到成员变量,但这看起来很糟糕
我不知道为什么你会这么想。
似乎我应该从onActivityResult
获取路径
欢迎您相信任何您想要的东西。相机应用程序开发人员希望阅读the documentation for ACTION_IMAGE_CAPTURE
。如果您提供Bitmap
,该文档并未声明相机应用必须返回任何内容。因此,许多相机应用程序将不会返回任何内容。
更新基于编辑:
嗯,你已经是。我应该在内部存储照片吗?
如果我将pic存储到外部存储器,我必须要求用户允许写入外部
这取决于你写作的地方。来自EXTRA_OUTPUT
的{{1}},getExternalFilesDir()
和亲属不需要Android 4.4+的许可。您在getExternalCacheDir()
上为外部存储位置调用的方法(例如Context
)确实需要Environment
,这是getExternalStoragePublicDirectory()
权限,需要在运行时请求。< / p>