Android7.0 应用内升级
Android7.0应用内升级
最近线上项目在7.0机器上出现应用内升级失败,原来是由于Android7.0权限问题导致。
如果项目的 targetSdkVersion>=24 在处理应用内升级的时候需要兼容7.0。
1、创建file_paths.xml文件
在res下创建xml文件夹,然后在xml文件夹下创建file_paths.xml文件。
1 <?xml version="1.0" encoding="utf-8"?> 2 <resources xmlns:android="http://schemas.android.com/apk/res/android"> 3 <paths> 4 <external-path 5 name="download" 6 path=""/> 7 </paths> 8 </resources>
说明:apk是下载在Environment.getExternalStorageDirectory()路径下的。
external-path代表 Environment.getExternalStorageDirectory()目录。
name:必须有。为Environment.getExternalStorageDirectory()的别名
path:可以为空。空代表Environment.getExternalStorageDirectory()目录下所有的文件夹和文件。
2、配置AndroidManifest.xml文件添加provider标签
1 <provider 2 android:name="android.support.v4.content.FileProvider" 3 android:authorities="com.ntjr.std.provider" 4 android:exported="false" 5 android:grantUriPermissions="true" 6 > 7 <meta-data 8 android:name="android.support.FILE_PROVIDER_PATHS" 9 android:resource="@xml/file_paths"/> 10 </provider>
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。