Android - 当文件位于外部SD卡上时,如何使用FileProvider获取文件的Uri?

11
当前,当文件位于外部SD卡上时,FileProvider的getUriForFile方法会生成IllegalArgumentException异常。 当文件位于设备内存中(在/storage/emulated/0下)时,则能正常工作。
 Uri videoUri = FileProvider.getUriForFile(this,
            getApplicationContext().getPackageName() + ".provider",
            new File(videoPath));

此处videoPath的值为:

videoPath =  /storage/extSdCard/Android/data/com.podcastcutter.debug/files/episodeMp3/TEDTalks (video)/Why you should love statistics - Alan Smith.mp4  

我的清单文件包含:

       <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>

这里是 provider_paths:

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

如何修改FileProvider配置以解决这个问题?

提前致谢。

生成的异常:

java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/extSdCard/Android/data/com.podcastcutter.debug/files/episodeMp3/TEDTalks (video)/Why you should love statistics - Alan Smith.mp4 
android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:711)                  
android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:400)

其他配置信息:

compileSdkVersion 25

buildToolsVersion "23.0.3"

minSdkVersion 16

targetSdkVersion 25

support libraries version : 25.1.1   

你最好扩展ContentProvider类,这样就可以从任何存储位置提供文件。更加灵活。 - greenapps
3个回答

37

我在provider.xml文件中添加了以下行,并成功地从SD卡获取文件URI:

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

完整的xml文件:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="external_files"
        path="." />
    <root-path
        name="external_files"
        path="/storage/" />
</paths>

4
即使它不在官方文档中,这也必须是被接受的答案。 - Mr. Fish
@Rodrigo Jardim,非常感谢,这个方法完美解决了我的问题。我之前花了很长时间按照其他答案去尝试修复它。 - scott
你一定在开玩笑。谢谢 - 你的答案对我也有用。 - Sebastian Roth
路径应该有不同的名称,否则FileProvider将只会初始化其中一个。 - John Doe

2
我该如何修改FileProvider配置来解决这个问题? 你无法这样做。FileProvider不支持可移动存储。

明白了。我最终实现了自己的视频活动。 - u2gilles

1
你的提供程序路径类型错误。你的videoPath显示了一条指向应用程序外部存储的路径,但你的提供程序路径使用了external-path,它链接到设备根目录下的外部存储。(/storage/emulated/0
将你的提供程序路径更改为 <external-files-path>...</external-files-path>

请再明确一些,我应该添加哪个路径? - u2gilles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接