【问题标题】:Android - FileProvider getUriForFile when the file is on an external SDAndroid - 当文件位于外部 SD 上时,FileProvider getUriForFile
【发布时间】:2023-03-24 09:21:01
【问题描述】:

目前,FileProvider getUriForFile 方法在文件位于外部 SD 时会生成 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 类。然后,您可以从每个存储位置提供文件。更加灵活。

标签: android android-sdcard android-fileprovider


【解决方案1】:

我在 provider.xml 中添加了这一行,并且可以很好地从 SD 卡获取文件 URI:

&lt;root-path name="external_files" path="/storage/" /&gt;

完整的xml文件:

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

【讨论】:

  • 这必须是公认的答案,即使它不在官方文档中。
  • @Rodrigo Jardim.thank you so much这工作得很好。我通过遵循其他答案浪费了整个来解决这个问题
  • 你在开玩笑吧。 Thx - 你的答案也对我有用。
  • 路径应该有不同的名称,否则 FileProvider 将仅使用其中一个进行初始化。
【解决方案2】:

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

你不能。 FileProvider 不支持可移动存储。

【讨论】:

  • 知道了。我最终实现了自己的视频活动。
【解决方案3】:

您的提供程序路径类型错误。您的 videoPath 显示了应用程序外部存储的路径,但您的提供程序路径使用的是链接到设备根外部存储的 external-path。 (/storage/emulated/0)

将您的提供者路径更改为&lt;external-files-path&gt;...&lt;/external-files-path&gt;

【讨论】:

  • 请您说得更清楚些。我应该添加什么路径?
猜你喜欢
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2017-07-04
  • 1970-01-01
  • 2011-11-07
相关资源
最近更新 更多