Android7.0应用内升级
最近线上项目在7.0机器上出现应用内升级失败,原来是由于Android7.0权限问题导致。
如果项目的 targetSdkVersion>=24 在处理应用内升级的时候需要兼容7.0。
1、创建file_paths.xml文件
在res下创建xml文件夹,然后在xml文件夹下创建file_paths.xml文件。
1 23 4 87
说明:apk是下载在Environment.getExternalStorageDirectory()路径下的。
external-path代表 Environment.getExternalStorageDirectory()目录。
name:必须有。为Environment.getExternalStorageDirectory()的别名
path:可以为空。空代表Environment.getExternalStorageDirectory()目录下所有的文件夹和文件。
2、配置AndroidManifest.xml文件添加provider标签
17 10
3、安装apk的方法进行版本判断:
1 public void installApk(Context context, File file) { 2 if (!file.exists()) { 3 ToastUtil.show(mContext, "安装失败"); 4 return; 5 } 6 Intent intent = new Intent(); 7 intent.setAction(android.content.Intent.ACTION_VIEW); //版本>=24 8 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //参数说明: context:上下文 authority:必须和provider中声明的android:authorities值一致 file:所下载的apk文件
9 Uri contentUri = FileProvider.getUriForFile(context, "com.ntjr.std.provider", file);10 intent.setDataAndType(contentUri, "application/vnd.android.package-archive");11 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);12 intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);13 } else {14 Uri uri = Uri.fromFile(file);15 intent.setDataAndType(uri, "application/vnd.android.package-archive");16 }17 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);18 context.startActivity(intent);19 }
要注意使用的是 addFlags还是setFlags。setFlags会清除掉上面所设置的flag。