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/