android每次版本的升级都开始原来越来越重视用户的安全,需要更多的权限。我们的项目现在将sdk更新到27后,出现了大量的问题,今天为大家处理一下安装apk。
android从7.0(24)开始就已经对安装进行了修改,增加了xml文件的路径处理。
8.0安装apk的流程如下:
注册文件添加权限 - 添加xml - 申请权限(27) - 安装处理(24) - 修改compileSdkVersion大于26
第一步:注册文件添加权限和privde
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<application android:name=".app.MainApplicaton"> <provider android:name="android.support.v4.content.FileProvider" android:authorities="包名" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
第二步:res文件中添加xml包,添加file_paths.xml文件,内容如下:
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="apk_path" path="." /> </paths>
第三步:判断sdk是否是8.0以上,添加未知来源安装apk的判断
private void installApkPermission(@NonNull String apkPath) { if(TextUtils.isEmpty(apkPath)){ return; } mApkPath = apkPath; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { boolean haveInstallPermission = getPackageManager().canRequestPackageInstalls(); //没有未知来源的安装权限需要引导用户进入到设置页面 if(!haveInstallPermission){ Toast.makeText(UpgradeActivity.this,"安装应用需要打开未知来源权限,请去设置中开启权限",Toast.LENGTH_LONG).show(); Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES); startActivityForResult(intent, INSTALLPERMISSIO_REQUESTCODE); }else { installApk(apkPath); } }else { installApk(apkPath); } }
第四步:安装,根据sdk是否大于24进行处理
private void installApk(@Nullable String apkPath) { if(TextUtils.isEmpty(apkPath)){ return; } File file = new File(apkPath); Intent intent = new Intent(Intent.ACTION_VIEW); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); } else { //Android7.0之后获取uri要用contentProvider Uri apkUri = FileProvider.getUriForFile(this, "包名", file); //Granting Temporary Permissions to a URI intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.setDataAndType(apkUri, "application/vnd.android.package-archive"); } intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getBaseContext().startActivity(intent); }第五步:修改compileSdkVersion 大于等于26 ,如果小于26就会导致获取未知安装权限(canRequestPackageInstalls)的时候永远返回false。