Android 7.0 運(yùn)行時(shí)權(quán)限彈窗問題的解決
Android 7.0系統(tǒng)在運(yùn)行應(yīng)用的時(shí)候,對(duì)權(quán)限做了諸多限制,normal, dangerous, signature, signatureOrSystem ,取決于保護(hù)級(jí)別,在確定是否授予權(quán)限時(shí),系統(tǒng)可能采取不同的操作。
- normal 表示權(quán)限是低風(fēng)險(xiǎn)的,不會(huì)對(duì)系統(tǒng)、用戶或其他應(yīng)用程序造成危害;
- dangerous 表示權(quán)限是高風(fēng)險(xiǎn)的,系統(tǒng)將可能要求用戶輸入相關(guān)信息,才會(huì)授予此權(quán)限;
- signature 表示只有當(dāng)應(yīng)用程序所用數(shù)字簽名與聲明引權(quán)限的應(yīng)用程序所用數(shù)字簽名相同時(shí),才能將權(quán)限授給它;
- signatureOrSystem 表示將權(quán)限授給具有相同數(shù)字簽名的應(yīng)用程序或android 包類。這一保護(hù)級(jí)別適和于非常特殊的情況,比如多個(gè)供應(yīng)商需要通過系統(tǒng)映像共享功能時(shí)
運(yùn)行時(shí)權(quán)限彈窗問題是很多系統(tǒng)定制的客戶要求屏蔽的,一直以來(lái)沒有特別好的方法,下面我分享一下我自己驗(yàn)證可行的方案
方案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)) {//注釋掉這個(gè)判斷
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);
}
}
}
}
簡(jiǎn)單說明下這個(gè)方案的修改原理,在PMS的systemReady方法中會(huì)遍歷所有擁有默認(rèn)運(yùn)行時(shí)權(quán)限應(yīng)用,通過遍歷它們的UserId來(lái)賦予權(quán)限,注釋掉判斷是否為擁有運(yùn)行時(shí)權(quán)限的應(yīng)用方法后,會(huì)遍歷所有應(yīng)用,遍歷應(yīng)用且賦予權(quán)限的操作是在DefaultPermissionGrantPolicy中g(shù)rantPermissionsToSysComponentsAndPrivApps方法,注釋掉判斷簽名應(yīng)用和系統(tǒng)應(yīng)用的方法,普通應(yīng)用也可以獲取所有運(yùn)行時(shí)權(quán)限,這樣所有應(yīng)用都不會(huì)有運(yùn)行時(shí)權(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);
...
}
簡(jiǎn)單解釋下第二中方案的思路,PMS在應(yīng)用安裝的時(shí)候會(huì)根據(jù)應(yīng)用是否為簽名應(yīng)用、系統(tǒng)應(yīng)用或三方應(yīng)用來(lái)更新權(quán)限,這里可以做成白名單的形式,目前通過SystemProperties來(lái)獲取三方包名可以通過adb或者串口來(lái)測(cè)試三方應(yīng)用權(quán)限是否可以正常獲取。兩種方案大家可以自由選擇。
到此這篇關(guān)于Android 7.0 運(yùn)行時(shí)權(quán)限彈窗問題的解決的文章就介紹到這了,更多相關(guān)Android7.0 權(quán)限彈窗 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Android Studio真機(jī)無(wú)線連接USB設(shè)備調(diào)試運(yùn)行詳解流程
- Android進(jìn)程運(yùn)行中權(quán)限被收回導(dǎo)致關(guān)閉的問題解決
- Android如何讓APP無(wú)法在指定的系統(tǒng)版本上運(yùn)行(實(shí)現(xiàn)方法)
- 解決AndroidStudio無(wú)法運(yùn)行java中的mian方法問題
- Android Studio 運(yùn)行按鈕灰色的完美解決方法
- Android studio 運(yùn)行main 函數(shù)的方法
- Android運(yùn)行時(shí)權(quán)限終極方案(PermissionX)
- Android Studio用genymotion運(yùn)行后小圖標(biāo)無(wú)法顯示問題
- 10種提升android運(yùn)行效率的建議
相關(guān)文章
Android使用WebView實(shí)現(xiàn)離線閱讀功能
這篇文章主要介紹了Android使用WebView實(shí)現(xiàn)離線閱讀功能,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下2021-04-04
Android仿微信聯(lián)系人列表字母?jìng)?cè)滑控件
這篇文章主要為大家詳細(xì)介紹了Android仿微信聯(lián)系人列表字母?jìng)?cè)滑控件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
Android之在linux終端執(zhí)行shell腳本直接打印當(dāng)前運(yùn)行app的日志的實(shí)現(xiàn)方法
今天小編就為大家分享一篇關(guān)于Android之在linux終端執(zhí)行shell腳本直接打印當(dāng)前運(yùn)行app的日志的實(shí)現(xiàn)方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02
淺談Android AsyncTask內(nèi)存安全的一種使用方式
這篇文章主要介紹了淺談Android AsyncTask內(nèi)存安全的一種使用方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2018-08-08
Flutter給控件實(shí)現(xiàn)鉆石般的微光特效
這篇文章主要給大家介紹了關(guān)于Flutter給控件實(shí)現(xiàn)鉆石般的微光特效的相關(guān)資料,實(shí)現(xiàn)的效果非常不錯(cuò),非常適合大家做開發(fā)的時(shí)候參考,需要的朋友可以參考下2021-08-08
Android XML設(shè)置屏幕方向(android:screenOrientation)詳解
這篇文章主要介紹了Android XML設(shè)置屏幕方向(android:screenOrientation)詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04

