时间:2021-05-21
Android 7.0系统在运行应用的时候,对权限做了诸多限制,normal, dangerous, signature, signatureOrSystem ,取决于保护级别,在确定是否授予权限时,系统可能采取不同的操作。
运行时权限弹窗问题是很多系统定制的客户要求屏蔽的,一直以来没有特别好的方法,下面我分享一下我自己验证可行的方案
方案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) { ... 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或者串口来测试三方应用权限是否可以正常获取。两种方案大家可以自由选择。
到此这篇关于Android 7.0 运行时权限弹窗问题的解决的文章就介绍到这了,更多相关Android7.0 权限弹窗 内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言:上篇重点学习了Android6.0的运行时权限,今天还是围绕着Android6.0权限适配来总结学习,这里主要介绍一下我们公司解决Android6.0权限
Android捕获运行时异常详解Android异常分为两类:CheckedException和UnCheckedExceptionCheckException:
先给大家看下问题描述,下图是我在运行时出现错误截图:解决方法分析原因,可能因为我平台迁移碰到权限问题我们来进行权限转换1)在Windows下转换:利用一些编辑器
前几天看了郭大神的运行时权限的专讲,深受启发,由于现在基于目前项目中的运行时权限封装的还不是那么完美,趁着郭神建议的还是历历在目。于是把它完整的敲了下来。并在此
在一些不多的数据下载和生成的时候,我们倾向于直接保存为文件,当我们修改某些参数后再一次运行时,之前运行时生成的文件就被覆盖了。为了解决这个问题,这里提供几个解决