鉴于某个时候我有一些外部库提供给我的URI,并且所有FileProvider的设置都正确完成了(并且URI被授予了读/写权限),我该如何获取磁盘上映像的路径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>
还有其他获取绝对路径的方法吗?
答案 0 :(得分:1)
如何获取URI指向的磁盘上映像的路径?
您不能,如果通过“外部库”表示“第三方应用程序”。另外,无论如何,您不太可能访问文件系统上的文件:
targetSdkVersion
为29或更高版本)或Android R(显然适用于所有应用)上无法访问的外部存储设备上的位置如果“外部库”是您自己的应用程序中的库,则可以尝试读取FileProvider
元数据XML资源,并使用它来找出与<virtualfolder>
路径匹配的根目录和路径分割。在此处,您可以生成一个File
,该指针指向该根目录,元数据路径以及其余Uri
路径的位置。
但是当尝试通过ContentResolver执行查询时,我得到了索引-1:
FileProvider
不支持DATA
列。 Android Q及更高版本也会阻止DATA
列进行类似类型的查询(例如,在MediaStore
上进行查询),因此您所依赖的任何代码都可能很快就会出现问题。>
使用ContentResolver
(例如openInputStream()
)来处理Uri
。