Android Framework默认授予第三方APP悬浮窗权限

2024-01-03 18:58:12

需求

有第三方应用启动会请求悬浮窗权限,因为代码中没有做规避,会弹出请求窗口,点击确认后还要跳到设置中进行授权确认.有点麻烦,想去掉请求窗口,默认授予悬浮窗权限给APP.

悬浮窗默认实现原理

AppOpsManager 是Google在Android4.3里面引进的应用程序操作(权限)的管理类,核心实现类为AppOpsService,这里主要是修改AppOpsService.
在framework中,将某一权限称为Op,即operation,
原理是在上层APP启动请求权限时,判定是请求悬浮窗,如果未授权则强制设置为可修改,并把悬浮窗权限写入到Op中.

int checkop(String op,int uid,String packageName)判断应用是否含有某个权限
AppOpsManager.checkOp()最终会调用到AppOpsService.checkOperationUnchecked(),
先看下此函数的实现

private @Mode int checkOperationUnchecked(int code, int uid, @NonNull String packageName,
            boolean raw) {
   
    RestrictionBypass bypass;
    try {
   
        bypass = verifyAndGetBypass(uid, packageName, null);
    } catch (SecurityException e) {
   
        Slog.e(TAG, "checkOperation", e);
        return AppOpsManager.opToDefaultMode(code);
    }

    if (isOpRestrictedDueToSuspend(code, packageName, uid)) {
   
        return AppOpsManager.MODE_IGNORED;
    }
    synchronized (this) {
   
        if (isOpRestrictedLocked(uid, code, packageName, bypass)) {
   
            return AppOpsManager.MODE_IGNORED;
        }
        code = AppOpsManager.opToSwitch(code);
        UidState uidState = getUidStateLocked(uid, false);
        if (uidState != null && uidState.opModes != null
                && uidState.opModes.indexOfKey(code) >= 0) {
   
            final int rawMode = uidState.opModes.get(code);
            return raw ? rawMode 

文章来源:https://blog.csdn.net/zmlovelx/article/details/135369853
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。