【问题标题】:Get content URI of images stored on sdcard using File Provider使用 File Provider 获取存储在 sdcard 上的图像的内容 URI
【发布时间】:2017-09-28 17:30:36
【问题描述】:

我有一个存储在 sd 卡中的图像文件,其绝对路径为 - storage/4469-0C17/DCIM/...,另一个图像存储在内部存储器中,具有绝对路径 - /storage/emulated/0/

我正在使用 FileProvider 与外部应用程序共享它。

现在,我可以共享存储在内部存储中的图像,但对于存储在外部存储中的图像,它会引发错误 -
java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/4469-0C17/DCIM/....

我的清单 -

<manifest>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <application>
    .....
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
                <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>
    </application>
</manifest>

provider_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="."/>
</paths>

代码 -

 Intent share = new Intent(Intent.ACTION_SEND);
 share.setType("image/*");
 File imageFileToShare = new File(filePath);
 Uri imageURI = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", imageFileToShare);
 share.putExtra(Intent.EXTRA_STREAM, imageURI);
 share.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
 context.startActivity(Intent.createChooser(share, "Share Image"));

【问题讨论】:

  • 在您的 provider_paths.xml 文件中,而不是 '.'试试'/'

标签: android android-fileprovider


【解决方案1】:

和另一个存储在内部存储器中的具有绝对路径的图像

这就是 Android SDK 所指的 external storage

但是对于存储在外部存储中的图像,它会引发错误 - java.lang.IllegalArgumentException:未能找到包含/storage/4469-0C17/DCIM/....的配置根目录

首先是removable storage,不是外部存储。

第二,FileProvider不支持移动存储。

【讨论】:

  • 所以在 android N 上我的应用程序无论如何都会崩溃。 ?有办法支持吗?
  • @Harshit:AFAIK,您的应用程序没有对storage/4469-0C17/DCIM/ 的直接文件系统访问权限,所以我不确定您从哪里获得该路径。
【解决方案2】:

与其使用您自己看到的非常有限的 FileProvider,不如从 ContentProvider 派生您自己的提供程序。

然后你可以提供任何你想要的文件。

CommonsWare 有一个很好的例子来设置这样的文件提供者。

【讨论】:

    【解决方案3】:

    将以下内容添加到您的 provider_paths.xml:

    <root-path path="." name="external_files" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 2012-07-02
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      相关资源
      最近更新 更多