前言:本人小白,刚入职。处理一个线上的项目,客户反应有一些人安装完新版本后会闪退,有一些人正常,我们这边统计发现android版本高于7的人会出现这种情况。
处理流程:
1.拉下代码进行测试发现,会报file:xxxxx的错误
2.要使用FileProvider,在manifrest.xml中添加(直接复制就可以):
`<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>`
然后在这个文件里面添加一个权限:`
<!-- android 7以上需要更新的权限 -->
<uses-permission
android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>`
<!-- ps:一定要注意位置,如果报红就是你的位置不对直接放在文件最上面的位置,这里是我踩的坑 -->
3.在app里的res目录下新建一个xml包和一个xml文件,并添加:
`<paths xmlns:android="http://schemas.android.com/apk/res/android">
<root-path name="root_path" path="." />
<external-path name="Android/data/com.pipeline.oa" path="."/>
<external-path path="." name="external_storage_root"/>
</paths>`
4.把原来的安装代码进行重构,这段代码android10以上也能适配(不知道位置的话就找到执行下载的代码,它下面那个就是安装的):`
File file = new File(Environment.getExternalStorageDirectory(), Version.UPDATE_SAVE_NAME);
Intent intent1 = new Intent(Intent.ACTION_INSTALL_PACKAGE);
Uri uri=null;
if (Build.VERSION.SDK_INT >Build.VERSION_CODES.M) {
String authority = "com.pipeline.oa.fileProvider";//这个就是刚才android:authorities=""里填的文字
uri = FileProvider.getUriForFile(WelcomeActivity.this, authority , file);
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent1.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
} else {
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
uri = Uri.fromFile(file);
}
intent1.setDataAndType(uri, "application/vnd.android.package-archive");
WelcomeActivity.this.startActivity(intent1);
this.finish();`
到这步就结束了。
后记:虽然这个是很基本的东西,但是我处理两天才弄好。其实当时新版本已经下载到了内部存储里,就是更新完闪退,进去又要重新更新但是我已经把安装代码重构了,配置文件也都照着网上的更新了,依旧闪退。之后看日志,都是网上找不到的一些异常信息。最后下班回去,无意间点了android studio右下角的更新,然后发现编译出现异常,里面说我mainfrest文件里的权限位置不对,下图是正确位置:
我把它放在了application里面了,我去,弄了一天。