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

两者之间的区别。getPath()vs cursor从Android中的uri获取文件的真实路径

壤驷喜
2023-03-14

这个问题的主要思想和标题一样——当你从Android中的uri中获得文件的真实路径时,. getPath()和cursor之间的区别是什么?

如果你不明白我使用光标的意思,这个例子就在这里。

private String getRealPathFromURI(Uri contentURI) {
    String result;
    Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
    if (cursor == null) { // Source is Dropbox or other similar local file path
        result = contentURI.getPath();
    } else { 
        cursor.moveToFirst(); 
        int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
        result = cursor.getString(idx);
        cursor.close();
    }
    return result;
}

最常见的两种方法是这两种,但使用游标似乎有点太复杂,而使用一种简单的方法可以得到相同的结果。getPath()。所以,我认为在某些情况下,我应该使用光标是有原因的,但我无法理解。

你能解释一下是什么吗?

共有1个答案

葛高澹
2023-03-14

什么是区别. getPath()与游标,当你得到一个文件的真实路径在Android的uri?

Uri不是文件。没有“真正的道路”。

如果Uri的方案是file,那么它代表文件系统上的一个文件,理论上,你的应用程序应该能够访问该文件。使用getPath()获取文件系统路径。

如果该方案是其他方案,那么它不一定代表文件系统中应用程序可以访问的文件。例如,如果方案是httphttps,则Uri表示将从Web服务器下载的内容。

如果方案是内容,则由内容提供者支持。使用ContentResolveropenInputStream()Uri标识的内容获取InputStream

如果方案是内容,并且您专门从MediaStore获取了Uri,那么您的光标方法可能会为您提供一条路径。它还可能给你提供null,你可能无法访问你获得的路径(仅仅因为系统的MediaStore可以索引文件并不意味着你的应用程序可以访问同一个文件)。在Android10上情况更糟,默认情况下,您没有外部存储的读取权限。因此,这种技术不可靠,不应使用。

不过,除此之外,您不能对使用什么数据来支持内容Uri做出任何假设。可能是:

  • 外部存储器上的本地文件
  • 另一个应用程序(例如,FileProvider)的内部存储上的本地文件。
  • 可移动存储上的本地文件
  • 加密的本地文件,需要由ContentProvider动态解密
  • 数据库BLOB列中的字节流,需要ContentProvider提供服务
  • 需要其他应用程序先下载的内容(例如Dropbox)
  • 。。。等等

所以,简单地说:Uri不是一个文件。没有“真正的道路”。

 类似资料:
  • createOrReplace eTempView和as函数别名火花sql查询使用的区别是什么? 我试图理解这两种方法之间的区别。

  • 我正在开发一款。我将启动意图的转换为字符串,它会给我。但我需要找到真正的路径。 例如:

  • 我想从图库中选择一个图像,然后使用它将图像加载到ImageView项中。 但是图像没有以正确的方式旋转,所以我应该使用ExifInterface类,并且exif构造函数希望文件的路径是字符串,而不是URI。 为了将URI转换为字符串,我编写了以下方法: 问题从这里开始... 结果变量总是返回null。我尝试了stackoverflow中的许多解决方案,如下所示: 我试图用null值查询投影。仍然返

  • 我试图从Xamarin Android中的intent chooser获得真正的路径,它在除Android 10之外的所有Android版本中都能正常工作。在Android10中,内容uri如下 content://com.android.providers.downloads.documents/document/msf:180

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

  • 问题内容: 我需要在WebContent目录中获取文件的真实路径,以便我使用的框架可以访问该文件。它仅将String文件作为属性,因此我需要在WebContent目录中获取此文件的真实路径。 我使用Spring Framework,因此应该可以在Spring中解决。 问题答案: 如果您在servlet中需要此功能,请使用!