是否可以从 FileProvider 生成的 URI 获取文件路径?
Is it possible to get File Path from FileProvider generated URI?
鉴于在某些时候我有一个外部库给我的 URI,并且所有 FileProvider 设置都正确完成(并且 URI 已被授予 read/write 权限),我如何获得路径到 URI 指向的磁盘上的映像?
假设图像文件存储在/sdcard/XYZAppFolder/file.jpg
。
在调试时我可以看到 URI 的字符串:
content://<applicationID>.provider/<virtualfolder>/file.jpg
但是当尝试通过 ContentResolver 执行查询时,我得到索引 -1:
Cursor cursor = contentResolver.query(contentURI, null, null, null,
cursor.moveToFirst();
int idx = cursor.getColumnIndex(Images.ImageColumns.DATA);
<paths>
<external-path
name="virtualfolder"
path="VISUAPP" />
</paths>
清单:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
还有其他获取绝对路径的方法吗?
how could I get the path to image on disk that the URI is pointing to?
你不能,如果 "external library" 你的意思是 "a third-party app"。此外,您不太可能访问文件系统上的文件,无论如何:
- 它可能在内部存储中
- 它可能在其他应用在可移动存储上的app-specific位置
- 它可能位于您的应用无法访问的外部存储位置 Android Q(默认情况下
targetSdkVersion
为 29 或更高)或 Android R(对于所有应用程序,显然)
如果 "external library" 你的意思是你自己的应用程序中的库,你可以尝试读取 FileProvider
元数据 XML 资源并使用它来找出匹配的根目录和路径<virtualfolder>
路径段。从那里,您可以生成一个 File
指向该根目录的位置、元数据路径和 Uri
路径的其余部分。
But when trying to perform a query via ContentResolver, I get index -1:
FileProvider
不支持 DATA
列。 Android Q 及更高版本还会阻止 DATA
列进行类似查询(例如,在 MediaStore
上),因此您拥有的任何依赖它的代码很可能一开始就出现问题很快。
使用 ContentResolver
(例如,openInputStream()
)与 Uri
一起工作。
鉴于在某些时候我有一个外部库给我的 URI,并且所有 FileProvider 设置都正确完成(并且 URI 已被授予 read/write 权限),我如何获得路径到 URI 指向的磁盘上的映像?
假设图像文件存储在/sdcard/XYZAppFolder/file.jpg
。
在调试时我可以看到 URI 的字符串:
content://<applicationID>.provider/<virtualfolder>/file.jpg
但是当尝试通过 ContentResolver 执行查询时,我得到索引 -1:
Cursor cursor = contentResolver.query(contentURI, null, null, null,
cursor.moveToFirst();
int idx = cursor.getColumnIndex(Images.ImageColumns.DATA);
<paths>
<external-path
name="virtualfolder"
path="VISUAPP" />
</paths>
清单:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
还有其他获取绝对路径的方法吗?
how could I get the path to image on disk that the URI is pointing to?
你不能,如果 "external library" 你的意思是 "a third-party app"。此外,您不太可能访问文件系统上的文件,无论如何:
- 它可能在内部存储中
- 它可能在其他应用在可移动存储上的app-specific位置
- 它可能位于您的应用无法访问的外部存储位置 Android Q(默认情况下
targetSdkVersion
为 29 或更高)或 Android R(对于所有应用程序,显然)
如果 "external library" 你的意思是你自己的应用程序中的库,你可以尝试读取 FileProvider
元数据 XML 资源并使用它来找出匹配的根目录和路径<virtualfolder>
路径段。从那里,您可以生成一个 File
指向该根目录的位置、元数据路径和 Uri
路径的其余部分。
But when trying to perform a query via ContentResolver, I get index -1:
FileProvider
不支持 DATA
列。 Android Q 及更高版本还会阻止 DATA
列进行类似查询(例如,在 MediaStore
上),因此您拥有的任何依赖它的代码很可能一开始就出现问题很快。
使用 ContentResolver
(例如,openInputStream()
)与 Uri
一起工作。