android关于provider包冲突的问题

最近项目要集成app自动更新的功能 图方便,用了updeteapputils这个开源的框架 使用起来也比较简单,

感兴趣的话可以自己看一下 链接:点击打开链接 git代码和介绍

 当然今天的重点不是这个 ,在我集成了这个之后,在android6.0和以下的手机下载和自动安装都没有问题,到了7.0的手机莫名其妙闪退了,发现报了一个这样的错误

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.PackageItemInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference

大概看了一下,应该是因为7.0安装权限的问题 ,然后看了一下解决方法http://www.jianshu.com/p/577816c3ce93 这里也有这个updateapputils的介绍和7.0权限的解决方案 ,

大致就是在配置文件中配置provider 来解决的 

注意这个时候又有坑了....在我加入这些配置之后 ,编译报错了 ,大概就是我的主工程和lib库的包冲突了 ,这就尴尬了,于是从网上面找了半天解决方法 

http://blog.csdn.net/R3lish/article/details/58147225 可以看一下这个博客 可以解决 

如果闲麻烦的话 有一个更简单的方法

在主工程manifest文件中引用了FileProvider:

错误信息

同样在lib库的manifest文件中也引用了FileProvider:

错误信息

编译器在编译工程合并manifest文件时候就抛出了provider冲突问题,显而易见是其中的authrities冲突了。

在as的log日志里和在网上查找资料都是说在主工程的manifest文件里的provider下加上tools:replace就能成功解决问题。加上后,看似确实编译通过了,但是在主工程或者lib库用到FileProvider读写文件的时候还是报错了,各种修改manifest文件也没能解决这个问题。

3.解决方法

其实一想,我们在应用中用的都是v4包提供的FileProvider类来读写文件的,从而导致冲突,如果我们自己在工程中新写个FileProvider类继承自系统的FileProvider类来读写文件不就问题解决了么?带着这个想法一试,果然成功了。皇天不负有心人呐!下面是所有的代码片段:

图片

图片

图片

上面这种做法有种好处就是不用将lib库下载下来然后修改lib库里的provider了,lib库里还是可以用原来的provider。


猜你喜欢

转载自blog.csdn.net/smallredzi/article/details/78827341