【发布时间】:2019-03-10 13:05:59
【问题描述】:
我正在尝试构建一些基本的文件管理器来浏览我的 Android P 设备上的外部存储文件。我有两种方法来创建使用外部应用程序打开文件的意图。除了 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 商店下载了几个文件管理器。例如:File Manager - Local and Cloud File Explorer(我猜是使用 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 没有所有文件
【问题讨论】:
-
“也许它不适合用于外部存储文件?” -- 你可能想发布你的
res/xml/provider_paths.xml资源。从Uri看来,您正在尝试将FileProvider用于removable storage,这不太可能正常工作。 -
@CommonsWare,我在所有可能的存储上都试过了,它总是只读的。 provider_paths 包括在内。
标签: android android-fileprovider