天天看点

【定制Android系统】Android O 默认允许应用弹窗申请权限

需求:Android 应用在 6.0 以后?就需要动态申请权限了,那些写在 AndroidManifest.xml 中的权限在应用运行时会弹窗申请。如果应用跑在不方便与最终用户做交互的场景,例如摄像头等,或者单纯地不希望应用再弹窗申请权限,而是默认授予应用全部的权限。

https://blog.csdn.net/frakie_kwok/article/details/78531500 这篇文章提到了一种在 pm/DefaultPermissionGrantPolicy.java 中,通过对包名的判断进行预授权的方法。

而当应用申请的权限在不断变化时,时而新增权限时,或者不知道应用想申请什么权限时,在上述位置把全部的权限预先授予应用,可能也是一种方法。但是目前我尚不清楚,上述对应用进行预授权的方法,是不是只在第一次开机时(或者恢复出厂设置后第一次开机时)、或者只在开机时会被调用,不知道在 PACKAGE_REPLACED、PACKAGE_ADDED 的时候,会不会被调用,也很难做到对一个包名改变了的应用进行预授权。

那么,下面将要说到的这种方法,就会比较健壮地对应用申请的权限提供授权操作。因为,它是在应用打开、发现权限尚未被授予、弹窗申请权限时,直接给与了确认操作。所以,这种方案会更普适一些,当然,也可以在该位置对包名加以分析,然后再决定是否对应用默认允许他们的权限;或者,可以对系统版本等信息进行判断,然后决定是否默认允许。

方案如下:

在 ap/packages/apps/PackageInstaller/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java 中;

在 onCreate 中,源码为

DevicePolicyManager devicePolicyManager = getSystemService(DevicePolicyManager.class);
        final int permissionPolicy = devicePolicyManager.getPermissionPolicy(null);
           

改为:

DevicePolicyManager devicePolicyManager = getSystemService(DevicePolicyManager.class);
        // modify by Enoch : auto grant app permission 
        final int permissionPolicy = DevicePolicyManager.PERMISSION_POLICY_AUTO_GRANT;