安卓 - 文件提供者 - 名称不能为空

10

我在清单文件中有以下的FileProvider:

    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.android.provider.DataSharing-1"
        android:exported="false"
        android:grantUriPermissions="true">

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

    </provider>

应用程序启动时我遇到了以下异常:

 java.lang.RuntimeException: Unable to get provider android.support.v4.content.FileProvider: java.lang.IllegalArgumentException: Name must not be empty
        at android.app.ActivityThread.installProvider(ActivityThread.java:4793)
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:4385)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4325)
        at android.app.ActivityThread.access$1500(ActivityThread.java:135)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5017)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.IllegalArgumentException: Name must not be empty
        at android.support.v4.content.FileProvider$SimplePathStrategy.addRoot(FileProvider.java:644)
        at android.support.v4.content.FileProvider.parsePathStrategy(FileProvider.java:587)
        at android.support.v4.content.FileProvider.getPathStrategy(FileProvider.java:534)
        at android.support.v4.content.FileProvider.attachInfo(FileProvider.java:352)
        at android.app.ActivityThread.installProvider(ActivityThread.java:4790) ...

我该如何解决这个问题?我错过指定名称的地方在哪里?

编辑:

res/xml/paths.xml

<paths xmlns:android="http://schemas.android.com/apk/res/android">

    <files-path android:name="my_images" android:path="images/"/>
</paths>

1
我不确定那是一个有效的权限名称(-1 让我有些犹豫)。然而,我认为你真正的问题在元数据中 -- 发布 res/xml/paths.xml - CommonsWare
@CommonsWare 我需要在代码中发布我如何使用FileProvider吗? - Jake
@CommonsWare 我尝试去掉“-1”。它仍然存在同样的问题。 - Jake
3个回答

14

从您的paths.xml文件中删除属性中的android:前缀。它应该看起来像:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="my_images" path="images/"/>
</paths>

(你可能也可以去掉xmlns:android这一部分,因为它并没有被使用,尽管我在我的一个项目中使用了它,也许是因为Eclipse在创建文件时将其放在那里...)

之前,我按照你说的有了“名称”和“路径”。但是后来出现了错误:Android属性缺少命名空间前缀。 - Jake
1
好的,它起作用了。我删除了xmlns..以及路径和名称中的“android:”。谢谢! - Jake
@Jake,你的paths.xml是什么样子的?我也卡在了同样的问题上。 - NitZRobotKoder

0
在我的情况下,XML文件保存为filename_V21.xml导致了问题。我将路径文件重命名为filename.xml解决了这个问题。

0

对我来说什么都没用。所以我从Android Studio中关闭了项目,然后删除了.gradle和.idea文件,然后它就像魔法般开始工作了 :) 首先是权限问题。你应该为你的应用程序提供.fileprovider或fileprovider,也许带有applicationId,然后它就可以工作了。希望这能帮助到某些人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接