当前位置: 首页 > 知识库问答 >
问题:

Android-从纵隔中获取URI的文件名和路径

栾和玉
2023-03-14

我想从图库中选择一个图像,然后使用它将图像加载到ImageView项中。

但是图像没有以正确的方式旋转,所以我应该使用ExifInterface类,并且exif构造函数希望文件的路径是字符串,而不是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个答案

顾鸣
2023-03-14

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

使用Android.support.media.exifinterface。它有一个接受InputStream的构造函数。通过在某个上下文上调用getContentResolver().OpenInputStream(uri),可以获得InputStream,例如,您的活动,其中uri是您的uri

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

因为该代码对URI做了许多毫无根据的假设。不要求URI引用文件系统中可以访问的文件,也不要求query()支持data列。

 类似资料:
  • 我正在尝试获取内容URI的文件路径。URL如下所示:content://com.android.providers.downloads.documents/document/31 游标对象不是null,但cursor.getString(column_index)返回null。 列索引始终为0。 编辑:内容URI是从文件管理器返回的,因此它应该表示实际的文件。

  • 我想从SD卡文件路径中获取文件名。e、 g.:/storage/sdcard0/DCIM/Camera/1414240995236。jpg我想得到1414240995236。jpg我已经编写了获取相同内容的代码,但它不起作用。请帮忙<下面是我的代码:

  • 我使用意图action_get_content调用startActivityForResult。有些应用程序返回给我的数据包含以下URI: 内容://media/external/images/media/18122 不知道是图像还是视频或者一些自定义内容。如何使用ContentResolver从这个URI获取实际的文件名或内容标题?

  • 我想从URI中获得完整的文件路径。URI不是图像,而是音乐文件,但如果我像纵隔解决方案那样做,如果应用程序用户选择eg Astro作为浏览器,而不是音乐播放器,它就不会工作。我怎么解决这个?

  • 问题内容: 我正在尝试从文件夹中包含在项目中的原始文件获取。但是无论如何,我都会得到一个。 该文件是一个文件,也尝试过使用,也不起作用。使用DOES 播放两个文件都可以。 的回报: 我的代码: 错误: 问题答案: 尝试这种方法,用作您的inputStream。沿着这个地方: 返回一个InputStream 编辑:如果您使用上述方法,请删除这些代码 希望这有帮助,祝你好运!^^

  • 我正在创建一个应用程序,从画廊上传选定的图像,并上传到一个网络服务。web服务需要所选图像的文件名以及文件内容的base64编码。我已经设法用硬编码的文件路径实现了这一点。然而,我很难获得图像的真实文件路径。我在网上看了很多资料,找到了这段代码,但它对我不起作用: 我得到这个错误: 编辑 忘了提到我正在使用Kitkat。看起来我的问题与KitKat有关。我发现了这个(见下文),它帮助我让我的应用程