来自Android相机意图的图像路径

时间:2015-12-18 22:33:02

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

我想找出拍摄照片后从相机获取文件路径的正确方法:

启动相机意图。因为我告诉相机写入内部存储器给它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存储到外部存储器,我必须要求用户允许写入外部。最后,如果我在外部存储图像,则设备上可以从外部存储读取的所有应用程序都可以读取该图像。这可能是我的应用的隐私问题。

1 个答案:

答案 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>