Android:FileProvider IllegalArgumentException无法找到包含/data/data/**/files/Videos/final.mp4的已配置根目录

时间:2015-07-10 15:58:14

标签: android android-fileprovider

我正在尝试使用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);

的Manifest.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" />

有关此的任何线索吗?

由于 尼茨

3 个答案:

答案 0 :(得分:52)

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

一起去:

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

答案 1 :(得分:6)

将您的提供商XML更改为此。

require 'redcarpet'

class MarkdownTemplateHandler

  def erb
    @erb ||= ActionView::Template.registered_template_handler(:erb)
  end

  def call(template, source)
    compiled_source = erb.call(template, source)
    "Redcarpet::Markdown.new(Redcarpet::Render::HTML.new).render(begin;#{compiled_source};end).html_safe"
  end

end

ActionView::Template.register_template_handler(:md, MarkdownTemplateHandler.new)

答案 2 :(得分:2)

我有完全相同的基本情况。我正确地定义了所有内容(xml中的files-path)但是还有一件事导致了同样的异常。我添加另一个答案只是作为补充,评论不会很好阅读。

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

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()提供的目录。