android开发之多个provider的解决方法:

下面的报错针对android7.0及以上都是一个问题就是provider的authorities没有对上。

看下报错代码:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference
        at android.support.v4.content.FileProvider.parsePathStrategy(FileProvider.java:604)
        at android.support.v4.content.FileProvider.getPathStrategy(FileProvider.java:578)
        at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:416)
        at com.mchsdk.paysdk.utils.YhshUtils.install(YhshUtils.java:147)
        at com.mchsdk.paysdk.utils.YhshUtils.access$200(YhshUtils.java:53)
        at com.mchsdk.paysdk.utils.YhshUtils$1.onSuccess(YhshUtils.java:113)
        at com.lidroid.xutils.http.HttpHandler.onProgressUpdate(HttpHandler.java:218)
        at com.lidroid.xutils.task.PriorityAsyncTask$InternalHandler.handleMessage(PriorityAsyncTask.java:385)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
    

出现上面问题的原因很多:我说下我遇到的

我这边是SDK有一份provider自己APP也有一份provide然后因为都是定义的android.support.v4.content.FileProvider虽然authorities不同但是经过我测试这样后者的provider会被覆盖,也就是说当后者的provider去查找authorities的时候查找的是前者的authorities导致找不到指定的路径就报错了,这种有多个provider的冲突问题解决办法非常简单

直接自定义Provider即可:

package com.xigu.zhenghesdk.demo;

import android.support.v4.content.FileProvider;

/**
 * @author Xiayiye5
 * 2020年8月5日11:09:51
 * 下面自定义FileProvider是为了解决游戏里面已定义了FileProvider的冲突问题
 * 如果你项目使用的最新androidX 库,FileProvider导入使用:androidx.core.content.FileProvider
 * 如果你使用的非androidX库,FileProvider导入使用:android.support.v4.content.FileProvider
 */
public class XiaYiYe5FileProvider extends FileProvider {
    public XiaYiYe5FileProvider() {
    }
}

新建provider如上图:然后在清单文件汇总配置下即可:

<!--配置Android7.0保存文件的路径-->
        <!--请将com.xigu.zhenghesdk.demo改成你自己的游戏包名-->
        <provider
            android:name="com.xigu.zhenghesdk.demo.XiaYiYe5FileProvider"
            android:authorities="${applicationId}.xiayiye5"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/apk_paths" />
        </provider>

个人建议:

1.上图代码中的authorities这个值一定要做到唯一不要和别的provider的authorities名字一样

2.上图中的resource资源路劲也尽量保持名字不重复例如我下载apk路劲定义的名字叫apk_paths

3.上图authorities的值一定要和你安装apk的值一致否则报错如下图一致:

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐