使用文件提供程序获取存储在SD卡上的图像的内容URI

时间:2017-03-07 11:46:56

标签: android android-fileprovider

我有一个存储在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"));

3 个答案:

答案 0 :(得分:0)

  

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

这就是Android SDK引用的external storage

  

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

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

其次,FileProvider不支持可移动存储。

答案 1 :(得分:0)

您可以从ContentProvider中更好地派生自己的提供程序,而不是使用您自己看到的FileProvider非常有限。

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

CommonsWare有一个很好的例子,说明如何设置这样的文件提供程序。

答案 2 :(得分:0)

添加到您的provider_paths.xml:

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