部分手机,尤指华为手机,特别是最近华为很多手机都开始升级上Android10,问题爆发尤其之多,在这主要讲一下跳转安装界面,然后报 解析包时出现问题 的几个原因和问题解决方法。说明一下,我用到跳转安装的方法是比较大众的,就是低版本就直接uriFromFile,AndroidN以上就用FileProvider的方式,这个方法网上一搜一大堆,我就不多说了。
原因1.安装包不存在
很坑的一个地方,跳转安装的方法里,即使包不存在,它依旧能够成功跳转,只是跳转后,提示“解析包时出现问题”这个莫名其妙的问题,注意一下,android10创建文件的方法改变了,有可能在你创建下载文件的时候就失败了,压根就没下载下来文件。
解决方法:
方法也比较简单,就是刚开始new File的之后,多加一个file.isFile()判断文件是不是存在,不存在就不跳转提示就可以了,依稀记得Android10判断文件存在的方式好像有了变动,暂时没有细查,isFile实测可以用。
原因2.没有安装权限
这里说的权限是
android.permission.REQUEST_INSTALL_PACKAGES
官方说明是targetSdkVersion25以上(不含25),则必须在AndroidManifest里包含这个权限声明,同时这个权限是signature级别的,就是还要去另外申请,没有这个权限就会报 解析包时出现问题 的错误,参考说明的地址是:https://developer.android.google.cn/reference/android/Manifest.permission
这里面还有一些其他权限的说明,还是挺全的,毕竟官方。
解决方法:
没啥好说的,就是如果你目标版本26和之上的,就加上这个权限,代码里可以用context.getPackageManager().canRequestPackageInstalls()来判断是否拥有这个权限,跳转打开这个权限的代码如下
Uri packageURI = Uri.parse("package:"+ getPackageName());
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES,packageURI);
startActivityForResult(intent, CUSTOM_REQUEST_CODE);
在onActivityResult里返回对应自定义的请求码,RESULT_OK 就是开启成功了,这里说明一下,canRequestPackageInstalls()方法必须是targetSdkVersion在26以上才会返回正确的值,低于26的都是固定返回false
原因3.跳转安装之后,杀死了自己
就是主动调用了例如System.exit(0)之类的,这个暂时只有部分手机出现这个问题,看报错日志是查找跳转过来的线程id查找不到,然后就报错了,估计也是需要上下文的。
解决方法:
如果你一切都是按照步骤执行,而且步骤都是没问题的,还是报解析包时出现问题,不妨看看是不是自己杀死了自己,不自杀试试,如果确实是这个原因,可以试一下延时关闭自己,延时个0.3秒左右,用户是体验不出来的,可能跳转过去差不多就这时间了。