首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FileProvider与MediaStore内容URI

FileProvider与MediaStore内容URI
EN

Stack Overflow用户
提问于 2019-03-10 13:05:59
回答 1查看 1.1K关注 0票数 0

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

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

代码语言:javascript
复制
content://com.myapp.FILE_PROVIDER/external_files/6537-6630/DCIM/Camera/20180727_221149.jpg

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

代码语言:javascript
复制
content://media/external/images/media/3273

其余代码是相同的。

代码语言:javascript
复制
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)在打开图像时有相同的只读访问问题。

代码

代码语言:javascript
复制
    <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没有所有的文件

EN

回答 1

Stack Overflow用户

发布于 2019-03-10 13:39:50

也许它不是为外部存储文件设计的?

您不能将它用于外部存储器。您正在将其用于可移动存储器

<root-path>没有文档化,也不受支持。FileProvider将无法可靠地用于可移动存储,因为您的应用程序无法访问可移动存储上的任意文件系统位置。我的猜测是,如果您尝试在应用程序中写入该文件--无论是使用File还是Uri --您都会失败。

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

是否有其他方法为现有文件获取有效的URI?

欢迎您使用ACTION_OPEN_DOCUMENT_TREE并要求用户选择他们的可移动存储。然后你可以:

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

请记住,用户不必选择他们的可移动存储--欢迎他们选择他们想要的任何文档树。正确的做法,这可以是一个功能,而不是一个错误,在你的应用程序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55087971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档