FileProvider与MediaStore内容URI

时间:2019-03-10 13:06:00

标签: android android-fileprovider

我正在尝试构建一些基本的文件管理器,以在我的 Android P 设备上浏览外部存储文件。我有两种方法,它们创建意图以使用外部应用程序打开文件。除 Uri 部分之外,这两种方法都是相同的

其中一个使用 FileProvider 从文件创建Uri,如下所示:

C:\Proyectos\kafka>docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
5ed898201a6d        app-tier            bridge              local
f0bd501b76fa        bridge              bridge              local
5c822b39b283        host                host                local
eb54047d3dc8        none                null                local

另一个查询 MediaStore 并返回如下所示的Uri:

content://com.myapp.FILE_PROVIDER/external_files/6537-6630/DCIM/Camera/20180727_221149.jpg

其余代码相同

content://media/external/images/media/3273

这两个URI均有效,但是当我使用通过 FileProvider 创建的图像打开图像(来自外部存储的随机图像)时,它们将以只读访问权限打开在外部应用程序中。我可以说是因为我没有编辑选项。使用MediaStore从Uri发出的图像将按预期方式打开,并具有写访问权和编辑选项。

我还从Play商店下载了几个文件管理器。例如:File Manager - Local and Cloud File Explorer(我猜它正在使用FileProvider)在打开图像时有相同的只读访问问题。

代码

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.setDataAndType(uri, mimeType);
startActivity(intent);

我的问题是:

1。使用FileProvider时会错过什么吗?也许不适用于外部存储文件?

2。是否还有其他方法可以获取现有文件的有效URI?因为MediaStore没有所有文件

1 个答案:

答案 0 :(得分:0)

  

也许不打算用于外部存储文件?

您没有将其用于external storage。您正在将其用于removable storage

<root-path>未记录且不受支持。 FileProvider对于可移动存储将无法可靠地工作,因为您的应用无法访问可移动存储上的任意文件系统位置。我的猜测是,如果您尝试在应用中写入该文件(无论使用File还是Uri),都会失败并显示错误。

MediaStore可以访问更多可移动存储,因为它是操作系统的一部分。

  

还有其他方法可以获取现有文件的有效URI吗?

欢迎您使用ACTION_OPEN_DOCUMENT_TREE并要求用户选择其可移动存储。然后,您可以:

  • 使用takePersistableUriPermission()可以长期访问用户选择的文档树
  • 使用DocumentFile遍历该文档树并获取其中的文档的Uri

请记住,用户不必选择可移动存储-欢迎他们选择所需的任何文档树。正确完成后,这可能是您应用中的功能,而不是错误。