软件编程
位置:首页>> 软件编程>> Android编程>> Android 7.0 运行时权限弹窗问题的解决

Android 7.0 运行时权限弹窗问题的解决

作者:lancelots  发布时间:2023-06-30 18:26:13 

标签:Android,权限弹窗

Android 7.0系统在运行应用的时候,对权限做了诸多限制,normal, dangerous, signature, signatureOrSystem ,取决于保护级别,在确定是否授予权限时,系统可能采取不同的操作。

  • normal 表示权限是低风险的,不会对系统、用户或其他应用程序造成危害;

  • dangerous 表示权限是高风险的,系统将可能要求用户输入相关信息,才会授予此权限;

  • signature 表示只有当应用程序所用数字签名与声明引权限的应用程序所用数字签名相同时,才能将权限授给它;

  • signatureOrSystem 表示将权限授给具有相同数字签名的应用程序或android 包类。这一保护级别适和于非常特殊的情况,比如多个供应商需要通过系统映像共享功能时

运行时权限弹窗问题是很多系统定制的客户要求屏蔽的,一直以来没有特别好的方法,下面我分享一下我自己验证可行的方案

方案1,修改frameworks/base/services/core/java/com/android/server/pm/PackageManagerService和frameworks/base/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy文件,PackageManagerService文件修改代码如下:


@Override
 public void systemReady() {
...
synchronized (mPackages) {
     ...
     for (int userId : UserManagerService.getInstance().getUserIds()) {
       //if (!mSettings.areDefaultRuntimePermissionsGrantedLPr(userId)) {//注释掉这个判断
         grantPermissionsUserIds = ArrayUtils.appendInt(
             grantPermissionsUserIds, userId);
       //}
     }
   }

DefaultPermissionGrantPolicy文件修改代码如下:


private void grantPermissionsToSysComponentsAndPrivApps(int userId) {
   Log.i(TAG, "Granting permissions to platform components for user " + userId);

synchronized (mService.mPackages) {
     for (PackageParser.Package pkg : mService.mPackages.values()) {
  // if (!isSysComponentOrPersistentPlatformSignedPrivAppLPr(pkg) //删掉isSysComponentOrPersistentPlatformSignedPrivAppLPr判断
if(!doesPackageSupportRuntimePermissions(pkg)
           || pkg.requestedPermissions.isEmpty()) {
         continue;
       }
       Set<String> permissions = new ArraySet<>();
       final int permissionCount = pkg.requestedPermissions.size();
       for (int i = 0; i < permissionCount; i++) {
         String permission = pkg.requestedPermissions.get(i);
         BasePermission bp = mService.mSettings.mPermissions.get(permission);
         if (bp != null && bp.isRuntime()) {
           permissions.add(permission);
         }
       }
       if (!permissions.isEmpty()) {
         grantRuntimePermissionsLPw(pkg, permissions, true, userId);
       }
     }
   }
 }

简单说明下这个方案的修改原理,在PMS的systemReady方法中会遍历所有拥有默认运行时权限应用,通过遍历它们的UserId来赋予权限,注释掉判断是否为拥有运行时权限的应用方法后,会遍历所有应用,遍历应用且赋予权限的操作是在DefaultPermissionGrantPolicy中grantPermissionsToSysComponentsAndPrivApps方法,注释掉判断签名应用和系统应用的方法,普通应用也可以获取所有运行时权限,这样所有应用都不会有运行时权限的弹窗了。

方案2,只修改frameworks/base/services/core/java/com/android/server/pm/PackageManagerService文件,修改grantPermissionsLPw方法,代码如下:


private void grantPermissionsLPw(PackageParser.Package pkg, boolean replace,
     String packageOfInterest) {
  ...
  /*add for grant thirdparty app permssion S*/
  final String thirdPkgName = SystemProperties.get("persist.thirdparty.packagenames","");

if(isSystemApp(pkg) || pkg.packageName.contains(thirdPkgName)){//xxx为包名
   final int permCount = pkg.requestedPermissions.size();
   for(int i = 0;i < permCount;i++){
     final String name = pkg.requestedPermissions.get(i);
     final BasePermission bp = mSettings.mPermissions.get(name);
     if(bp != null && permissionsState.grantInstallPermission(bp) != PermissionsState.PERMISSION_OPERATION_FAILURE){
       changeInstallPermission = true;
     }
  }
  /*add for grant thirdparty app permission E*/
  permissionsState.setGlobalGids(mGlobalGids);
  ...
}

简单解释下第二中方案的思路,PMS在应用安装的时候会根据应用是否为签名应用、系统应用或三方应用来更新权限,这里可以做成白名单的形式,目前通过SystemProperties来获取三方包名可以通过adb或者串口来测试三方应用权限是否可以正常获取。两种方案大家可以自由选择。

来源:https://blog.csdn.net/lancelots/article/details/104790172

0
投稿

猜你喜欢

  • 本文将介绍如何通过Java程序来查找并高亮PDF中的文本。使用工具:Free Spire.PDF for Java(免费版)Jar文件获取及
  • 详细描述maven中央仓库发布jar包的中间过程, 以及遇到的一些问题汇总, 尽量用文字描述清楚, 耐心看下去, 就一定会发布成功----S
  • 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是
  • 今天给大家介绍一下如何用Java swing实现五子棋的开发即用Java开发图形界面程序五子棋,代码由于太多,只贴部分,最下面会附上下载地址
  • 压缩包制作也是很多项目中需要用到的功能。比如有大量的文件(假设有10000个)需要上传,1个1个的上传似乎不太靠谱(靠,那得传到什么时候啊?
  • J2ee 高并 * 况下 * 实例详解引言:在高并发下限制最大并发次数,在web.xml中用过滤器设置参数(最大并发数),并设置其他相关参数。
  • 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创
  • Map接口Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value;Map中的
  • 一、延迟加载resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),associati
  • 页面:上传文件时的关键词:enctype="multipart/form-data"<%@ page langua
  • 介绍:kaptcha 是谷歌开源的非常实用的验证码生成工具一、导入jar包<!-- kaptcha验证码 --><depe
  • 什么是深度优先什么是深度,即向下,深度优先,即向下优先,一口气走到底,走到底发现没路再往回走。在算法实现上来讲,深度优先可以考虑是递归的代名
  • 现在网上很多应用都是用二维码来分享网址或者其它的信息。尤其在移动领域,二维码更是有很大的应用场景。因为项目的需要,需要在网站中增加一个生成二
  • 在本篇博文中,我们主要讲解一下 IntelliJ IDEA 安装目录中的一些核心文件的功能及用法:如上图所示,我们定位到了 IntelliJ
  • 这篇文章主要介绍了Spring Cloud Hystrix异常处理方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参
  • 本文实例讲述了c#图像截取的实现方法。分享给大家供大家参考。具体如下:图像截取的相关代码如下: public Form1()&nb
  • 一、# List泛型集合集合是OOP中的一个重要概念,C#中对集合的全面支持更是该语言的精华之一。为什么要用泛型集合?在C# 2.0之前,主
  • 在.NET 4.0(当然也包括4.0以前的版本)下,用反射判断某个方法是否运用了自定义Attribute时,可以通过调用MethodInfo
  • springboot开启事务很简单,只需要一个注解@Transactional 就可以了。因为在springboot中已经默认对jpa、jd
  • 服务限流,是指通过控制请求的速率或次数来达到保护服务的目的,在微服务中,我们通常会将它和熔断、降级搭配在一起使用,来避免瞬时的大量请求对系统
手机版 软件编程 asp之家 www.aspxhome.com