使用文件提供商获取存储在SDCARD上的图像的内容



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

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

这就是Android SDK称为外部存储。

但对于存储在外部存储中的图像,它会引发错误 java.lang.illegalargumentException:无法找到包含/storeare/4469-0c17/dcim/....

的配置的根

首先,这是可移动的存储,而不是外部存储。

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

而不是使用fileprovider,正如您所看到的那样,您非常有限,您可以从ContentProvider中获得自己的提供商。

然后您可以提供所需的任何文件。

Commonsware有一个很好的示例,如何设置这样的文件提供商。

添加到您的provider_paths.xml以下:

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

最新更新