我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android 7.0 运行时权限弹窗问题

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android  7.0 运行时权限弹窗问题

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 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) {
      ...
      
      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;
            }
      }
      
      permissionsState.setGlobalGids(mGlobalGids);
      ...
  }

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


作者:lancelots


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android 7.0 运行时权限弹窗问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android 7.0 运行时权限弹窗问题

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

python selenium运行时弹出窗口问题怎么解决

本篇内容主要讲解“python selenium运行时弹出窗口问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python selenium运行时弹出窗口问题怎么解决”吧!去除pyth
2023-06-21

Android 13运行时权限变更一览

本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每个工作日都有文章更新。 要不了多久,Android 13正式版就要发布了。 其实就在几个月前,我写了一篇关于Android 13首个开发者体验版的全面
2023-08-19

详解Android权限管理之Android 6.0运行时权限及解决办法

前言:今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以上设备越来越多了,所以Android 6.
2022-06-06

在 Windows 11 上运行 go mod tidy 时出现 gitlab 权限问题

php小编草莓发现,在使用Windows 11操作系统时,有些开发人员在运行"go mod tidy"命令时遇到了GitLab权限问题。这个问题可能导致无法正确更新模块依赖关系。为了解决这个问题,我们将在本文中为大家提供一些解决方案和建议,
在 Windows 11 上运行 go mod tidy 时出现 gitlab 权限问题
2024-02-09

详解Android数据存储之Android 6.0运行时权限下文件存储的思考

前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以往直接sdcard根目录上直接新建了一个
2022-06-06

Android Studio 3.6运行模拟器时Emulator警告问题的解决方案

手贱更新了android studio过后,编译不报错,只要启动模拟器就会报出两行emulator警告,关掉模拟器也会有警告,之前版本用的都好好的,怎么消除警告问题? Emulator: emulator: WARNING: Emulato
2022-06-06

如何解决Android studio升级到3.0之后运行时的问题示例

这篇文章主要为大家展示了“如何解决Android studio升级到3.0之后运行时的问题示例”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决Android studio升级到3.0之后运
2023-05-30

Android Studio 3.6运行模拟器时,Emulator警告问题如何解决?全网无解决方法

手贱更新了android studio过后,编译不报错,只要启动模拟器就会报出两行emulator警告,关掉模拟器也会有警告,之前版本用的都好好的,怎么消除警告问题? Emulator: emulator: WARNING: Emulato
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录