原因:Android8.0的诸多新特性中有一个非常重要的特性:未知来源应用权限。
以前安装未知来源应用的时候一般会弹出一个弹窗让用户去设置允许还是拒绝,并且设置为允许之后,所有的未知来源的应用都可以被安装。
Android8.0的变化是,未知应用安装权限的开关被除掉,取而代之的是未知来源应用的管理列表,需要在里面打开每个应用的未知来源的安装权限。Google这么做是为了防止一开始正经的应用后来开始通过升级来做一些不合法的事情,侵犯用户权益。
当你的应用直接适配到Android8之后,内部启动应用安装是会被阻塞的,如果不处理好这个未知来源的权限,会导致应用根本无法更新,只能去应用市场重新下载。 (网上找的)
解决方法:
先加个权限:
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
注意这个不是运行时权限,不能代码申请啊。
然后安装前检查一下
//安装前检测权限,安装android8.0 需要权限
public static void installBefore() {
boolean haveInstallPermission;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//先获取是否有安装未知来源应用的权限
haveInstallPermission = BGIApplication.getInstance().getCurrentActivity().getPackageManager().canRequestPackageInstalls();
if (!haveInstallPermission) {//没有权限
new AlertDialog.Builder(BGIApplication.getInstance().getCurrentActivity())
.setTitle("提示")
.setMessage("安装应用需要打开未知来源权限,请去设置中开启权限")
.setNegativeButton("退出", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
ToastUtil.toastShort("没有安装权限,安装失败。");
System.exit(0);
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Uri packageURI = Uri.parse("package:" + BGIApplication.getInstance().getCurrentActivity().getPackageName());
//注意这个是8.0新API
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
BGIApplication.getInstance().getCurrentActivity().startActivityForResult(intent,CODE_UPDATE);
dialog.cancel();
}
}
})
.show()
.setCanceledOnTouchOutside(false);
return;
}
}
//有权限,开始安装应用程序
install();
}
权限申请完之后在 onActivityResult 里面判断下就好,resultCode == RESULT_OK那就是给权限了,直接安装吧。
在Android 8.0系统中,由于未知来源应用权限管理的改变,安装未知来源的APK时不再提供全局开关,而是需要针对每个应用单独授权。这导致直接安装应用可能会被阻止,需要在应用内部处理未知来源安装权限。解决方法包括在AndroidManifest.xml中添加安装权限,并在安装前检查和处理权限回调。
762

被折叠的 条评论
为什么被折叠?



