我正在尝试构建一些基本的文件管理器,以在我的 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没有所有文件
答案 0 :(得分:0)
也许不打算用于外部存储文件?
您没有将其用于external storage。您正在将其用于removable storage。
<root-path>
未记录且不受支持。 FileProvider
对于可移动存储将无法可靠地工作,因为您的应用无法访问可移动存储上的任意文件系统位置。我的猜测是,如果您尝试在应用中写入该文件(无论使用File
还是Uri
),都会失败并显示错误。
MediaStore
可以访问更多可移动存储,因为它是操作系统的一部分。
还有其他方法可以获取现有文件的有效URI吗?
欢迎您使用ACTION_OPEN_DOCUMENT_TREE
并要求用户选择其可移动存储。然后,您可以:
takePersistableUriPermission()
可以长期访问用户选择的文档树DocumentFile
遍历该文档树并获取其中的文档的Uri
值请记住,用户不必选择可移动存储-欢迎他们选择所需的任何文档树。正确完成后,这可能是您应用中的功能,而不是错误。