当前位置: 首页 > article >正文

Android 默认打开应用的权限

有项目需要客户要安装第三方软件,但是要手动点击打开权限,就想不动手就打开。

//安装第三方软件,修改方式

frameworks\base\services\core\java\com\android\server\pm\PackageManagerService.java

//找到如下源码:

//有三种方式,但是只有1 或 3 ,两种方式有用


    // Now that we successfully installed the package, grant runtime
    // permissions if requested before broadcasting the install. Also
    // for legacy apps in permission review mode we clear the permission
    // review flag which is used to emulate runtime permissions for
    // legacy apps.
    if (grantPermissions) {
        final int callingUid = Binder.getCallingUid();
        mPermissionManager.grantRequestedRuntimePermissions(
                res.pkg, res.newUsers, grantedPermissions, callingUid);
    }
    
    //如下修改
    if (packageName.equals("com.android.test")) {
        final int callingUid = Binder.getCallingUid();
        
        //1 该方法打开所有请求的权限
        mPermissionManager.grantRequestedRuntimePermissions(
                res.pkg, res.newUsers, grantedPermissions, callingUid);
        
        //2 该方法似乎不起作用
        //grantRuntimePermission(packageName,"android.permission.SYSTEM_OVERLAY_WINDOW",res.uid);
        //grantRuntimePermission(packageName,"android.permission.SYSTEM_ALERT_WINDOW",res.uid);
        //grantRuntimePermission(packageName,"android.permission.MANAGE_APP_ALL_FILES_ACCESS_PERMISSION",res.uid);
        
        //3 只打开一个 SYSTEM_ALERT_WINDOW 权限
        AppOpsManager mAppOpsManager = mContext.getSystemService(AppOpsManager.class);
        mAppOpsManager.setMode(AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
            res.uid, packageName,AppOpsManager.MODE_ALLOWED);
    }
   

//内置应用权限修改方式:

frameworks\base\services\core\java\com\android\server\pm\permission\DefaultPermissionGrantPolicy.java

private void grantDefaultSystemHandlerPermissions(PackageManagerWrapper pm, int 
userId) {

//末尾加入

grantMyPermissions(pm, "com.android.test", userId);

}

private void grantMyPermissions(PackageManagerWrapper pm,String pkg,int userId){
    Log.i(TAG,"other package Permissions");
    PackageInfo pkginfo = pm.getPackageInfo(pkg);
    if(pkginfo==null){
        return;
    }
    Set<String> permissions = new ArraySet<>();
    permissions.add("android.permission.SYSTEM_OVERLAY_WINDOW");
    permissions.add("android.permission.SYSTEM_ALERT_WINDOW");
    permissions.add("android.permission.WRITE_EXTERNAL_STORAGE");
    permissions.add("android.permission.READ_EXTERNAL_STORAGE");
    grantRuntimePermissions(pm,pkginfo, permissions,false, userId);
}


http://www.kler.cn/a/162104.html

相关文章:

  • MySQL技巧之跨服务器数据查询:进阶篇-从A数据库复制到B数据库的表中
  • 在Java中使用ModelMapper简化Shapefile属性转JavaBean实战
  • 【计算机网络】【网络层】【习题】
  • 图片画廊 day2 (可复制源码)
  • 在 Service Worker 中caches.put() 和 caches.add()/caches.addAll() 方法他们之间的区别
  • 基于非时空的离身与反身智能
  • bat脚本之加法
  • Linux_vi/vim编辑器
  • Qt基础之四十:Qt Installer Framework(QtIFW)的编译、使用和实现原理
  • 【Python系列】Python函数
  • 经验分享|MySQL分区实战(RANGE)
  • 系列学习前端之第 4 章:一文精通 JavaScript
  • 【开源视频联动物联网平台】J2mod库写一个Modbus TCP 服务器
  • 在Arch Linux上安装yay
  • Tair(1):Tair介绍
  • vue2-使用vue-i18n搭建多语言切换环境
  • gitlab-jenkins-shell-helm-chart-k8s自动化部署微服务
  • CopyOnWriteArraySet怎么用
  • 用户管理 --汇总
  • C#无标题栏窗体拖动方法
  • C#-数组池减少GC工作
  • 智能优化算法应用:基于北方苍鹰算法无线传感器网络(WSN)覆盖优化 - 附代码
  • 前端——html拖拽原理
  • Redis默认序列化方式乱码原因及解决办法
  • 谷歌正式发布最强 AI 模型 Gemini
  • C语言——常用库函数