在更新apk时之前写的代码是适配android7.0的版本,android8.0,android9.0下载成功后,屏幕闪了一下,没有跳转到系统安装界面,随后查阅资料知android8.0添加了新的安全措施,不允许应用内安装未经过Google play验证的应用,所以我们又得针对8.0,9.0系统做适配.
第一步在xml文件里面写上权限
- 在清单文件中添加如下权限:
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
发现并没有什么用,原来是没有打开安装未知应用的权限
判断是否已经获取到允许安装未知应用
在8.0中的PackageManager类中多了 canRequestPackageInstalls() 这个方法来检查是否已经获取到允许安装未知应用。
if (Build.VERSION.SDK_INT>=26){ boolean hasInstallPermission = isHasInstallPermissionWithO(mContext); if (!hasInstallPermission) { startInstallPermissionSettingActivity(mContext); return; }
}
@RequiresApi(api = Build.VERSION_CODES.O) private boolean isHasInstallPermissionWithO(Context context){ if (context == null){ return false; } return context.getPackageManager().canRequestPackageInstalls(); }
startInstallPermissionSettingActivity方法是:开启设置安装未知来源应用权限界面,最好是写上apk的包名,直接跳转到当前apk权限界面
/** * 开启设置安装未知来源应用权限界面 * @param context */ @RequiresApi(api = Build.VERSION_CODES.O) private void startInstallPermissionSettingActivity(Context context) { if (context == null) { return; } Intent intent = new Intent(); //获取当前apk包URI,并设置到intent中(这一步设置,可让“未知应用权限设置界面”只显示当前应用的设置项) Uri packageURI = Uri.parse("package:" + context.getPackageName()); intent.setData(packageURI); //设置不同版本跳转未知应用的动作 if (Build.VERSION.SDK_INT >= 26) { //intent = new Intent(android.provider.Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES,packageURI); intent.setAction(android.provider.Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES); } else { intent.setAction(android.provider.Settings.ACTION_SECURITY_SETTINGS); } ((Activity) context).startActivity(intent); Toast.makeText(mContext, "请打开未知应用安装权限", Toast.LENGTH_SHORT).show(); }
这样以来8.0以上的手机就适配成功啦~