Android-从Mediastore获取URI的文件名和路径

时间:2018-10-13 12:29:59

标签: android bitmap

我打算从图库中选择一张图像,然后使用该图像将图像加载到ImageView项中。

但是图像不能正确旋转,因此我应该使用ExifInterface类,并且exif构造函数希望文件的路径为String而不是URI。

然后将URI转换为字符串,我编写了此方法:

private String getRealPathFromURI(Uri contentURI) {
    String result;
    String[] proj = { MediaStore.Images.Media.DATA };
    Cursor cursor = getActivity().getContentResolver()
            .query(contentURI, proj, null, null, null);
    if (cursor == null) {
        result = contentURI.getPath();
    } else {
        cursor.moveToFirst();
        int idx = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
        result = cursor.getString(idx);
        cursor.close();
    }
    return null;
}

问题从这里开始...

结果变量无论如何始终返回null。我已经尝试了很多在stackoverflow中找到的解决方案,如下所示:

  • 我尝试使用null值查询投影。.仍然返回null且idx值为-1。
  • 我尝试使用MediaStore.Images.Media.DATA一次,而其他时候使用MediaStore.Images.ImageColumns.DATA ..仍然返回null
  • 我试图通过投影使光标逐列返回 为null ..并非所有值都可用于Exif。
  • 在idx上面的代码中返回0,所以我通过curser.getType(idx)检查列的类型,它返回0,这意味着该列为空值。
  • 我确保可以读取外部存储设备的权限。仍然为空
  • 我把钢笔放在我旁边,用力地摔了一下,它撞到了我的猫..仍然无效,现在我的猫生我的气了。

那为什么所有这些都不起作用?我该怎么办?

1 个答案:

答案 0 :(得分:2)

  

exif构造函数希望文件的路径为String而不是URI。

使用android.support.media.ExifInterface。它有a constructor that takes an InputStream。您可以通过在某些InputStream(例如您的getContentResolver().openInputStream(uri))上调用Context来获得Activity,其中uri是您的Uri

  

那为什么所有这些都不起作用?

因为该代码对Uri做出了许多毫无根据的假设。不需要Uri引用您可以访问的文件系统上的文件,也不需要query()支持DATA列。

相关问题