问题的主要思想与标题相同 - 当您从 Android 中的 uri 获取文件的真实路径时,.getPath() 与光标之间有什么区别?
如果您没有理解我使用游标的意思,示例在此处。
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;
}
Run Code Online (Sandbox Code Playgroud)
最常用的两种方式是这两种,但是使用游标似乎有点太复杂了,而您可以通过一种简单的方法 .getPath() 获得相同的结果。所以,我认为在某些情况下我应该使用光标肯定是有原因的,但我无法理解。
你能解释一下它会是什么吗?
当您从 Android 中的 uri 获取文件的真实路径时,.getPath() 与光标之间有什么区别?
AUri
不是文件。没有“真正的道路”。
如果的方案Uri
是file
,那么它代表文件系统上的一个文件,理论上,您的应用程序应该能够访问该文件。使用getPath()
来获取文件系统路径。
如果方案是其他任何东西,它不一定代表您的应用程序可以访问的文件系统上的文件。例如,如果方案是http
或https
,则Uri
表示将从 Web 服务器下载的内容。
如果该方案是content
,则它由 支持ContentProvider
。使用ContentResolver
和openInputStream()
来获取InputStream
由 标识的内容Uri
。
如果该方案是content
并且您专门Uri
从 中获得MediaStore
,那么您的Cursor
方法可能会给您提供一条路径。它也可能给你null
,并且你可能无法访问你获得的路径(仅仅因为系统MediaStore
可以索引文件并不意味着你的应用程序可以访问同一个文件)。这在 Android 10 上更糟,默认情况下您没有对外部存储的读取访问权限。因此,这种技术是不可靠的,不应使用。
但是,除此之外,您无法对使用哪些数据来支持这一点做出任何假设content
Uri
。它可能是:
FileProvider
)ContentProvider
BLOB
数据库列中的字节流,需要由ContentProvider
所以,总结一下: aUri
不是文件。没有“真正的道路”。
归档时间: |
|
查看次数: |
860 次 |
最近记录: |