是否可以从 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 一起工作。