是否可以从FileProvider生成的URI获取文件路径?

时间:2019-06-18 11:50:41

标签: android android-contentresolver android-fileprovider

鉴于某个时候我有一些外部库提供给我的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>

还有其他获取绝对路径的方法吗?

1 个答案:

答案 0 :(得分:1)

  

如何获取URI指向的磁盘上映像的路径?

您不能,如果通过“外部库”表示“第三方应用程序”。另外,无论如何,您不太可能访问文件系统上的文件:

  • 它可能在内部存储器中
  • 它可能位于可移动存储设备上另一个应用程序特定于应用程序的位置
  • 它可能位于您的应用无法在Android Q(默认为targetSdkVersion为29或更高版本)或Android R(显然适用于所有应用)上无法访问的外部存储设备上的位置

如果“外部库”是您自己的应用程序中的库,则可以尝试读取FileProvider元数据XML资源,并使用它来找出与<virtualfolder>路径匹配的根目录和路径分割。在此处,您可以生成一个File,该指针指向该根目录,元数据路径以及其余Uri路径的位置。

  

但是当尝试通过ContentResolver执行查询时,我得到了索引-1:

FileProvider不支持DATA列。 Android Q及更高版本也会阻止DATA列进行类似类型的查询(例如,在MediaStore上进行查询),因此您所依赖的任何代码都可能很快就会出现问题。

使用ContentResolver(例如openInputStream())来处理Uri