【问题标题】:Android: FileProvider IllegalArgumentException Failed to find configured root that contains /data/data/**/files/Videos/final.mp4Android:FileProvider IllegalArgumentException 未能找到包含 /data/data/**/files/Videos/final.mp4 的已配置根目录
【发布时间】:2015-07-10 15:58:13
【问题描述】:

我正在尝试使用FileProvider 播放来自私有路径的视频。面对

java.lang.IllegalArgumentException: Failed to find configured root that contains /data/data/XXXXX(Package)/files/Videos/final.mp4

代码:

<paths>
    <files-path path="my_docs" name="Videos/" />
</paths>

Java 代码:

File imagePath = new File(getFilesDir(), "Videos");
File newFile = new File(imagePath, "final.mp4");
Log.d(TAG, "-------------newFile:"+newFile.exists());//True here
//Exception in below line
Uri contentUri = FileProvider.getUriForFile(this,"com.wow.fileprovider", newFile);

清单.xml

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.wow.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">

<meta-data
    android:name="android.support.FILE_PROVIDER_PATHS"
    android:resource="@xml/file_paths" />

这有什么线索吗?

谢谢 尼兹

【问题讨论】:

  • 在实现 Fileprovider 时,我在 @xml/file_paths 中收到“属性缺少 Android 命名空间前缀”。后来不知何故,我把名称和路径放错了位置,最后遇到了这个问题。跨度>

标签: android android-fileprovider


【解决方案1】:

您的namepath 已翻转。 nameUri 中的内容,path 是文件系统根目录中的相对位置。

去:

<paths>
    <files-path name="my_docs" path="Videos/" />
</paths>

【讨论】:

  • 天哪!想知道我是怎么放错地方的。你救了我的一天谢谢.. :-)
  • 卡在“java.lang.SecurityException: Permission Denial: 从 ProcessRecord{44c35948 3239:com.mxtech.videoplayer.ad/u0a307} 打开提供程序 android.support.v4.content.FileProvider (pid= 3239, uid=10307) 未从 uid 10221 导出”尝试通过意图传递给视频播放器。
  • @NitZRobotKoder:如果“视频播放器”是指一个单独的应用程序,则将FLAG_GRANT_READ_URI_PERMISSION 添加到您的IntentstartActivity() 一起使用以启动播放器。如果“视频播放器”是指MediaPlayer,我会选择FileDescriptor,而不是ContentProvider。如果“视频播放器”是指VideoView,我没有任何建议。
  • intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);意图.addFlags(意图.FLAG_ACTIVITY_NEW_TASK); Log.d(TAG, "------------PAth:"+contentUri.getPath());意图.setData(contentUri); intent.setType("video/mp4");喜欢它,但得到“写入 parceljava.lang.IllegalArgumentException 异常:索引 1 处的绑定值为 null”
  • 请参阅stackoverflow.com/questions/31321310/… 现在采用文件提供者路线。尝试使用可用的外部视频播放器播放。
【解决方案2】:

将您的提供程序 XML 更改为此。

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

【讨论】:

    【解决方案3】:

    我也有同样的基本情况。我正确定义了所有内容(xml 中的文件路径),但还有一件事会导致相同的异常。我添加了另一个答案,就像添加一样,评论将无法很好地阅读。

    我创建/读取了存储文件的目录,例如:

    context.getDir("Documents", Context.MODE_PRIVATE) 
    

    这导致如下路径:

    /data/user/0/ch.myapp/app_Documents/6c3c70d5-af66-48ef-8dfc-f4341de4e1bd.docx

    然后我将创建目录更改为:

    File directory = new File(context.getFilesDir(), "Documents");
    if (!directory.exists()) {
      directory.mkdir();
    }
    

    这导致如下路径:

    /data/user/0/ch.myapp/files/Documents/6c3c70d5-af66-48ef-8dfc-f4341de4e1bd.docx

    根据文档Open a directory,据我了解,这两种方法应该是等效的。但它创造了一条不同的路径......也许这个公式在文档中对我来说并不清楚,但对我来说它写错了。

    getDir(名称,模式)

    在您的文件夹中创建一个新目录(或打开一个现有目录) 应用程序的唯一文件系统目录。这个新目录出现在里面 getFilesDir() 提供的目录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多