Android 7.0系統(tǒng)在運行應用的時候,對權限做了諸多限制,normal, dangerous, signature, signatureOrSystem ,取決于保護級別,在確定是否授予權限時,系統(tǒng)可能采取不同的操作。
創(chuàng)新互聯(lián)建站是一家專注于做網(wǎng)站、成都網(wǎng)站設計與策劃設計,民勤網(wǎng)站建設哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設10年,網(wǎng)設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:民勤等地區(qū)。民勤做網(wǎng)站價格咨詢:18980820575
運行時權限彈窗問題是很多系統(tǒng)定制的客戶要求屏蔽的,一直以來沒有特別好的方法,下面我分享一下我自己驗證可行的方案
方案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方法,注釋掉判斷簽名應用和系統(tǒng)應用的方法,普通應用也可以獲取所有運行時權限,這樣所有應用都不會有運行時權限的彈窗了。
方案2,只修改frameworks/base/services/core/java/com/android/server/pm/PackageManagerService文件,修改grantPermissionsLPw方法,代碼如下:
private void grantPermissionsLPw(PackageParser.Package pkg, boolean replace, String packageOfInterest) { ... /*add for grant thirdparty app permssion S*/ 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; } } /*add for grant thirdparty app permission E*/ permissionsState.setGlobalGids(mGlobalGids); ... }
簡單解釋下第二中方案的思路,PMS在應用安裝的時候會根據(jù)應用是否為簽名應用、系統(tǒng)應用或三方應用來更新權限,這里可以做成白名單的形式,目前通過SystemProperties來獲取三方包名可以通過adb或者串口來測試三方應用權限是否可以正常獲取。兩種方案大家可以自由選擇。
到此這篇關于Android 7.0 運行時權限彈窗問題的解決的文章就介紹到這了,更多相關Android7.0 權限彈窗 內(nèi)容請搜索創(chuàng)新互聯(lián)以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持創(chuàng)新互聯(lián)!
網(wǎng)頁題目:Android7.0運行時權限彈窗問題的解決
標題來源:http://www.muchs.cn/article6/gcehog.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站、品牌網(wǎng)站建設、、企業(yè)網(wǎng)站制作、Google、域名注冊
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)