【问题标题】:Android File Provider: IllegalArgumentException: Failed to find configured root that contains /external/video/media/678Android 文件提供程序:IllegalArgumentException:无法找到包含 /external/video/media/678 的已配置根目录
【发布时间】:2016-11-17 01:42:31
【问题描述】:

我想从图库中获取图像,但我的文件提供程序有问题。

开启

Uri contentUri = getUriForFile(getContext(), "com.pkg.name.fileprovider", result);

我得到了这个例外:

      11-16 16:57:54.923 24662-24662/com.pkg.name E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.pkg.name, PID: 24662
    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=20, result=-1, data=Intent { (has extras) }} to activity {com.pkg.name/com.pkg.name.activities.MainNavigationActivity}: java.lang.IllegalArgumentException: Failed to find configured root that contains /external/video/media/678
        at android.app.ActivityThread.deliverResults(ActivityThread.java:3845)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:3888)
        at android.app.ActivityThread.access$1300(ActivityThread.java:178)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1519)
        at android.os.Handler.dispatchMessage(Handler.java:111)
        at android.os.Looper.loop(Looper.java:194)
        at android.app.ActivityThread.main(ActivityThread.java:5643)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
     Caused by: java.lang.IllegalArgumentException: Failed to find configured root that contains /external/video/media/678
        at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:711)
        at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:400)
        at com.pkg.name.fragments.ChatFragment.sendVideo(ChatFragment.java:620)
        at com.pkg.name.fragments.ChatFragment.access$1600(ChatFragment.java:80)
        at com.pkg.name.fragments.ChatFragment$19.onResult(ChatFragment.java:603)
        at com.pkg.name.fragments.ChatFragment$19.onResult(ChatFragment.java:600)
        at com.pkg.name.controllers.AttachmentPanelController.commitText(AttachmentPanelController.java:214)
        at com.pkg.name.fragments.ChatFragment.commitText(ChatFragment.java:635)
        at com.pkg.name.activities.MainNavigationActivity.onActivityResult(MainNavigationActivity.java:417)
        at android.app.Activity.dispatchActivityResult(Activity.java:6301)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:3841)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:3888) 
        at android.app.ActivityThread.access$1300(ActivityThread.java:178) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1519) 
        at android.os.Handler.dispatchMessage(Handler.java:111) 
        at android.os.Looper.loop(Looper.java:194) 
        at android.app.ActivityThread.main(ActivityThread.java:5643) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:372) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

这是我的@xml/file_paths

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="photos" path="Pictures/" />
    <files-path name="videos" path="Videos/" />
    <files-path name="temp" path="temp/" />
    <external-path name="root" path="/" />
</paths>

我认为root命名路径无法访问:

/external/video/media/

因为它在媒体保留存储部分。

【问题讨论】:

  • 你从哪里得到result?如果您通过在Uri 上调用getPath() 得到它,那就是您的问题所在。
  • 它来自new File(tempVideo.getPath()),其中Uri tempVideo 来自Intent.ACTION_PICK 意图
  • 我需要做这些转换以将 Intent Extra 中的值作为字符串传递

标签: android android-fileprovider


【解决方案1】:

它来自 new File(tempVideo.getPath()) 其中 Uri tempVideo 来自 Intent.ACTION_PICK 意图

Uri 不是文件。仅当Uri 的方案为file 时,对Uri 调用getPath() 才有效。在你的情况下,方案是content,在这种情况下getPath() 是没有意义的。而且,由于不需要用户选择实际上是文件的内容,因此请使用Uri。特别是,由于您似乎正在积极尝试获取content Uri,请认识到您已经拥有一个,并尝试不加修改地直接使用它。

【讨论】:

  • 好的,谢谢,这是一个很好的建议,它帮助我清理了一些代码并保持整洁。但是如何将 Uri 传递给 Intent 中的另一个活动?我必须将其转换为字符串吗?!例如,如果我想在单独的活动中显示图像以添加一些详细信息,然后再上传。
  • @JackD:假设其他活动是您的,您可以在Intent 上使用setData()putExtra()UriParcelable,所以不需要转换。
  • 是的,这很好。谢谢你。此外,我可以使用 Uri.toString()Uri.parseUri(String) 将其放入 StringExtra。
猜你喜欢
  • 1970-01-01
  • 2013-12-14
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多