android用代码的方式勾选 "允许安装来自未知来源,Android 8.1 允许安装未知来源权限/允许来自此来源的应用...

Android 8.1以后,允许安装未知来源的应用权限细化到每个应用。本文分析了实现这一功能的代码逻辑,包括检查和设置`REQUEST_INSTALL_PACKAGES`权限,以及设置界面的逻辑,涉及`AppOpsManager`和`PackageManager`的相关操作。
摘要由CSDN通过智能技术生成

之前 6.0 的未知来源权限是一个总的权限,现在单独分开了具体到 app 对应的权限了。具体可见截图

8278f146ff5c99de83e1339e21694c7f.png

安装未知来源权限其实就是这货 Manifest.permission.REQUEST_INSTALL_PACKAGES,具体的修改代码方案已经在上篇 Android9.0/8.1/6.0 默认给系统 app 授予所有权限中提供了。这篇只是分析解题思路。

核心方法如下

if (checkInstallPackagesPermission(pkgName, mPackageInfo)) {

Log.e(TAG, pkgName + " need grant INSTALL_PACKAGES permission");

mAppOpsManager.setMode(AppOpsManager.OP_REQUEST_INSTALL_PACKAGES,

mPackageInfo.applicationInfo.uid, pkgName, AppOpsManager.MODE_ALLOWED);

Log.e(TAG, "grant INSTALL_PACKAGES permission done");

}

private static boolean checkInstallPackagesPermission(String packageName, PackageInfo mPackageInfo){

int uid = mPackageInfo.applicationInfo.uid;

//boolean permissionGranted = hasPermission(Manifest.permission.REQUEST_INSTALL_PACKAGES, uid);

boolean permissionRequested = hasRequestedAppOpPermission(Manifest.permission.REQUEST_INSTALL_PACKAGES, packageName);

int appOpMode = getAppOpMode(AppOpsManager.OP_REQUEST_INSTALL_PACKAGES, uid, packageName);

return appOpMode != AppOpsManager.MODE_DEFAULT || permissionRequested;

}

private static int getAppOpMode(int appOpCode, int uid, String packageName) {

return mAppOpsManager.checkOpNoThrow(appOpCode, uid, packageName);

}

private static boolean hasRequestedAppOpPermissi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值