Android 7.0 運行時權(quán)限彈窗問題的解決
Android 7.0系統(tǒng)在運行應(yīng)用的時候,對權(quán)限做了諸多限制,normal, dangerous, signature, signatureOrSystem ,取決于保護(hù)級別,在確定是否授予權(quán)限時,系統(tǒng)可能采取不同的操作。
- normal 表示權(quán)限是低風(fēng)險的,不會對系統(tǒng)、用戶或其他應(yīng)用程序造成危害;
- dangerous 表示權(quán)限是高風(fēng)險的,系統(tǒng)將可能要求用戶輸入相關(guān)信息,才會授予此權(quán)限;
- signature 表示只有當(dāng)應(yīng)用程序所用數(shù)字簽名與聲明引權(quán)限的應(yīng)用程序所用數(shù)字簽名相同時,才能將權(quán)限授給它;
- signatureOrSystem 表示將權(quán)限授給具有相同數(shù)字簽名的應(yīng)用程序或android 包類。這一保護(hù)級別適和于非常特殊的情況,比如多個供應(yīng)商需要通過系統(tǒng)映像共享功能時
運行時權(quán)限彈窗問題是很多系統(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方法中會遍歷所有擁有默認(rèn)運行時權(quán)限應(yīng)用,通過遍歷它們的UserId來賦予權(quán)限,注釋掉判斷是否為擁有運行時權(quán)限的應(yīng)用方法后,會遍歷所有應(yīng)用,遍歷應(yīng)用且賦予權(quán)限的操作是在DefaultPermissionGrantPolicy中g(shù)rantPermissionsToSysComponentsAndPrivApps方法,注釋掉判斷簽名應(yīng)用和系統(tǒng)應(yīng)用的方法,普通應(yīng)用也可以獲取所有運行時權(quán)限,這樣所有應(yīng)用都不會有運行時權(quán)限的彈窗了。
方案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在應(yīng)用安裝的時候會根據(jù)應(yīng)用是否為簽名應(yīng)用、系統(tǒng)應(yīng)用或三方應(yīng)用來更新權(quán)限,這里可以做成白名單的形式,目前通過SystemProperties來獲取三方包名可以通過adb或者串口來測試三方應(yīng)用權(quán)限是否可以正常獲取。兩種方案大家可以自由選擇。
到此這篇關(guān)于Android 7.0 運行時權(quán)限彈窗問題的解決的文章就介紹到這了,更多相關(guān)Android7.0 權(quán)限彈窗 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Android Studio真機無線連接USB設(shè)備調(diào)試運行詳解流程
- Android進(jìn)程運行中權(quán)限被收回導(dǎo)致關(guān)閉的問題解決
- Android如何讓APP無法在指定的系統(tǒng)版本上運行(實現(xiàn)方法)
- 解決AndroidStudio無法運行java中的mian方法問題
- Android Studio 運行按鈕灰色的完美解決方法
- Android studio 運行main 函數(shù)的方法
- Android運行時權(quán)限終極方案(PermissionX)
- Android Studio用genymotion運行后小圖標(biāo)無法顯示問題
- 10種提升android運行效率的建議
相關(guān)文章
解析離線安裝Eclipse的Android ADT開發(fā)插件的具體操作(圖文)
本篇文章是對離線安裝Eclipse的Android ADT開發(fā)插件的具體操作進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Android自定義ActionProvider ToolBar實現(xiàn)Menu小紅點
這篇文章主要介紹了Android自定義ActionProvider ToolBar實現(xiàn)Menu小紅點,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09Android Studio編寫AIDL文件后如何實現(xiàn)自動編譯生成
這篇文章主要介紹了Android Studio編寫AIDL文件后如何實現(xiàn)自動編譯生成,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03Android開發(fā)ImageView圖片無法顯示解決過程
在Android中ImageView無法顯示加載的本地SDCard圖片:過程為先調(diào)用本地照相機程序攝像,然后將拍攝的圖片加載在ImageView中顯示,具體解決方法如下,感興趣的朋友可以參考下哈2013-06-06發(fā)布?Android?library?到?Maven?解析
這篇文章主要介紹了發(fā)布?Android?library到Maven解析,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09SimpleCommand實現(xiàn)上傳文件或視頻功能(四)
這篇文章主要介紹了SimpleCommand實現(xiàn)上傳文件或視頻功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10