我正在尝试构建一些基本的文件管理器,以便在我的Android 设备上浏览外部存储文件。我有和两种方法,用来创建使用外部应用程序()打开文件的意图。这两个方法都是,除了Uri部分之外,都是相同的。
其中之一使用FileProvider从文件中创建Uri,该文件如下所示:
content://com.myapp.FILE_PROVIDER/external_files/6537-6630/DCIM/Camera/20180727_221149.jpg另一个查询MediaStore并返回如下所示的Uri:
content://media/external/images/media/3273其余代码是相同的。
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);两个URI都是有效的,但是当我使用使用FileProvider创建的映像(来自外部存储的随机图像)时,它们在外部应用程序中使用只读访问打开。我能看出来是因为我没有编辑选项。使用MediaStore从Uri中打开的图像按预期方式打开,具有写访问权,从而具有编辑选项。
我还从Play商店下载了几个文件管理器。例如:文件管理器-本地和云文件资源管理器 (我猜它正在使用FileProvider)在打开图像时有相同的只读访问问题。
代码
<provider
android:name="com.myapp.files.MyFileProvider"
android:authorities="${applicationId}.FILE_PROVIDER"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="." />
<root-path name="external_files" path="/storage/" />
</paths>我的问题是:
1.我在使用FileProvider时是否遗漏了什么?也许它不适用于外部存储文件??
2.是否有其他方法为现有文件获取有效的URI?因为MediaStore没有所有的文件
发布于 2019-03-10 13:39:50
也许它不是为外部存储文件设计的?
<root-path>没有文档化,也不受支持。FileProvider将无法可靠地用于可移动存储,因为您的应用程序无法访问可移动存储上的任意文件系统位置。我的猜测是,如果您尝试在应用程序中写入该文件--无论是使用File还是Uri --您都会失败。
MediaStore可以访问更多的可移动存储,因为它是操作系统的一部分。
是否有其他方法为现有文件获取有效的URI?
欢迎您使用ACTION_OPEN_DOCUMENT_TREE并要求用户选择他们的可移动存储。然后你可以:
takePersistableUriPermission()对用户选择的文档树进行长期访问。DocumentFile遍历该文档树并获取其中文档的Uri值请记住,用户不必选择他们的可移动存储--欢迎他们选择他们想要的任何文档树。正确的做法,这可以是一个功能,而不是一个错误,在你的应用程序。
https://stackoverflow.com/questions/55087971
复制相似问题