Android文件提供程序:IllegalArgumentException:未能找到包含/external/video/media/678的已配置根目录

Android文件提供程序:IllegalArgumentException:未能找到包含/external/video/media/678的已配置根目录,android,android-fileprovider,Android,Android Fileprovider,我正试图从图库中获取图像,但我的文件提供程序有问题 在 我得到一个例外: 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, reques

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

我得到一个例外:

      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\u路径

<?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>
因为它位于介质保留存储部件上

它来自新文件(tempVideo.getPath()),其中Uri tempVideo来自Intent.ACTION\u PICK Intent


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

您从哪里获得
结果
?如果您是通过调用
Uri
上的
getPath()
得到它的,这就是问题所在。它来自
new File(tempVideo.getPath())
其中
Uri tempVideo
来自
Intent。ACTION\u PICK
Intent需要进行这些转换,以将Intent额外的值作为stringOk传递,谢谢,这是一个很好的建议,它帮助我清理了一些代码并保持其整洁。但是如何将Uri传递给意图中的另一个活动?我必须把它转换成字符串吗?!例如,如果我想在一个单独的活动中显示图像以添加一些详细信息,然后再上载它。@JackD:假设这个其他活动是您的,您可以在
Intent
上使用
setData()
putExtra()
Uri
Parcelable
,因此您不需要转换它。是的,这很好。非常感谢。此外,我可以使用
Uri.toString()
Uri.parseUri(String)
将其放入StringExtra中。
<?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>
/external/video/media/