Android 默認打開應用權限


問題描述

系統預裝APK和后安裝的APK,默認全部打開應用,不彈窗提醒!不彈窗提醒!不彈窗提醒!

解決方法

1、系統預裝應用

W:\Code\RK3399PRO_HDMI_ANDROID8\frameworks\base\services\core\java\com\android\server\pm\DefaultPermissionGrantPolicy.java文件內的

private void grantDefaultSystemHandlerPermissions(int userId)

方法中增加如下代碼:

        synchronized (mService.mPackages) {
            //以下代碼為增加的部分
            PackageParser.Package EV_DesktopPckg = getPackageLPr( "com.example.desktop");
            if (EV_DesktopPckg != null) {
                grantRuntimePermissionsLPw(EV_DesktopPckg, MICROPHONE_PERMISSIONS, true, userId);
                grantRuntimePermissionsLPw(EV_DesktopPckg, STORAGE_PERMISSIONS, true, userId);
                grantRuntimePermissionsLPw(EV_DesktopPckg, CONTACTS_PERMISSIONS, true, userId);
                grantRuntimePermissionsLPw(EV_DesktopPckg, PHONE_PERMISSIONS, true, userId);
                grantRuntimePermissionsLPw(EV_DesktopPckg, CALENDAR_PERMISSIONS, true, userId);
                grantRuntimePermissionsLPw(EV_DesktopPckg, CAMERA_PERMISSIONS, true, userId);
                grantRuntimePermissionsLPw(EV_DesktopPckg, LOCATION_PERMISSIONS, true, userId);
                grantRuntimePermissionsLPw(EV_DesktopPckg, SENSORS_PERMISSIONS, true, userId);
                grantRuntimePermissionsLPw(EV_DesktopPckg, SMS_PERMISSIONS, true, userId);
                grantRuntimePermissionsLPw(EV_DesktopPckg, STORAGE_PERMISSIONS, true, userId);
            }
            PackageParser.Package EV_WebViewTestPckg = getPackageLPr( "com.example.webviewtest");
            if (EV_WebViewTestPckg != null) {
                grantRuntimePermissionsLPw(EV_WebViewTestPckg, MICROPHONE_PERMISSIONS, true, userId);
                grantRuntimePermissionsLPw(EV_WebViewTestPckg, STORAGE_PERMISSIONS, true, userId);
                grantRuntimePermissionsLPw(EV_WebViewTestPckg, CONTACTS_PERMISSIONS, true, userId);
                grantRuntimePermissionsLPw(EV_WebViewTestPckg, PHONE_PERMISSIONS, true, userId);
                grantRuntimePermissionsLPw(EV_WebViewTestPckg, CALENDAR_PERMISSIONS, true, userId);
                grantRuntimePermissionsLPw(EV_WebViewTestPckg, CAMERA_PERMISSIONS, true, userId);
                grantRuntimePermissionsLPw(EV_WebViewTestPckg, LOCATION_PERMISSIONS, true, userId);
                grantRuntimePermissionsLPw(EV_WebViewTestPckg, SENSORS_PERMISSIONS, true, userId);
                grantRuntimePermissionsLPw(EV_WebViewTestPckg, SMS_PERMISSIONS, true, userId);
                grantRuntimePermissionsLPw(EV_WebViewTestPckg, STORAGE_PERMISSIONS, true, userId);
            }

說明:如果有其它預裝應用程序,以此類推

2、后安裝的應用

W:\Code\RK3399PRO_HDMI_ANDROID8\frameworks\base\services\core\java\com\android\server\pm\PackageManagerService.java

private void handlePackagePostInstall(PackageInstalledInfo res, boolean grantPermissions,
            boolean killApp, boolean virtualPreload, String[] grantedPermissions,
            boolean launchedForRestore, String installerPackage,
            IPackageInstallObserver2 installObserver)

其中部分代碼修改如下即可

            // Now that we successfully installed the package, grant runtime
            // permissions if requested before broadcasting the install. Also
            // for legacy apps in permission review mode we clear the permission
            // review flag which is used to emulate runtime permissions for
            // legacy apps.
			if(true
            //if (grantPermissions
			// || 
				// res.name.equals("com.example.desktop") || 
				// res.name.equals("com.example.webviewtest") || 
				// res.name.equals("com.example.desktop")
				) {
                grantRequestedRuntimePermissions(res.pkg, res.newUsers, grantedPermissions);
            }

源碼中默認的為grantPermissions,可根據需求增加自己的應用,該修改為所有應用都打開權限

Android 9 平台

在Android 9平台上,權限結構已改變,除以上修改外,還要加上以下修改:

frameworks\base\services\core\java\com\android\server\pm\permission\PermissionManagerService.java文件內,修改

private void grantPermissions(PackageParser.Package pkg, boolean replace,
            String packageOfInterest, PermissionCallback callback)

函數部分為:

增加如下:

if (bp != null && permissionsState.grantInstallPermission(bp) !=
                PermissionsState.PERMISSION_OPERATION_FAILURE) {
                    changedInstallPermission = true;
                }

意為:只要要獲取的權限沒啥問題,就通過!changedInstallPermission = true;

以上方法針對危險權限((Dangerous Permission)),但還有其他系統權限權限想要默認開啟無法用此方法。

PACKAGE_USAGE_STATS權限

​ 該權限可使應用統計其他應用使用情況,想要默認開啟

​ 先在AndroidMainfests.xml中增加

    <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"
        tools:ignore="ProtectedPermissions" />

​ 再使用ADB命令開啟

pm grant com.example.hello android.permission.PACKAGE_USAGE_STATS

WRITE_SETTINGS權限

​ 該權限可用於修改系統設置,如修改系統亮度等。

​ 需要默認開啟該權限,需使用系統簽名

​ 先在AndroidMainfests.xml中增加

<uses-permission android:name="android.permission.WRITE_CONTACTS" />

​ 和

android:sharedUserId="android.uid.system"

​ 再在該預裝應用的Android.mk中增加如下

LOCAL_CERTIFICATE := platform

最后編譯系統燒錄固件即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM