天天看點

【定制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;