【问题标题】:GetRealPathFromUri always get null resultGetRealPathFromUri 总是得到空结果
【发布时间】:2014-11-24 20:13:46
【问题描述】:

我正在尝试从 Uri(从图库中选择的图像)获取真实路径,但是此函数始终返回 null 值:

//Convert the image URI to the direct file system path of the image file
public String getRealPathFromURI(Uri contentUri) {

    Cursor cursor = null;
    try {

        String[] proj = { MediaStore.Images.Media.DATA };
        cursor = getActivity().getContentResolver().query(contentUri,  proj, null, null, null);
        cursor.moveToFirst();
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        return cursor.getString(column_index);
    } finally {

        if (cursor != null) {

            cursor.close();
        }
    }
}

【问题讨论】:

    标签: android uri


    【解决方案1】:

    这是因为您选择的图像在设备上实际上不可用。

    来自画廊或其他选择的图像可以来自不提供物理文件的不同来源,例如云存储。

    在此处查看此代码,了解如何将Uri 作为可用于创建文件副本(或直接读取)的InputStream 打开。

    Android: Getting a file URI from a content URI?

    编辑:

    我正在对此做一些额外的研究,显然它也会因如何您请求此 Uri 而有所不同。

    如果您这样请求(根据 Android 指南,这是当前的首选方法):

     i = new Intent(Intent.ACTION_GET_CONTENT);
     i.addCategory(Intent.CATEGORY_OPENABLE);
     i.setType("image/*");
     startActivityForResult(i, REQUEST_STORAGE);
    

    它会打开 KitKat 风格的 unified 选择器,如果您从那里选择图像,它将始终返回 null。如果您打开左侧抽屉菜单,选择图库(或文件浏览器),然后从中选择一张图片,那么如果是本地文件图片,您将获得正确的路径。

    另一方面,如果您这样请求(这是旧方法):

     i = new Intent(Intent.ACTION_PICK);
     i.setType("image/*");
     startActivityForResult(i, REQUEST_STORAGE);
    

    它将直接打开图库,同样,如果是本地文件图像,您将获得正确的路径。

    所以是的,我仍然不相信有办法只强制本地化,但至少你有更多信息可以对你的编码做出明智的决定。

    【讨论】:

    • 那么有没有办法只显示设备上可用的图像?
    • 我不相信我见过这个选项。我相信,如果您想施加此限制,唯一的方法是创建自己的“照片选择”。但是,如果您找到了一种方法,请与我们分享。
    • 现在我将使用您的解决方案,因为我没有太多时间,但将来我会尝试制作并分享它。我也可以收到你的邮件吗?
    • 嗨。我用一些额外的信息编辑我的答案可能会有用。
    • 非常感谢它真的很有帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2012-10-31
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多