From 4a5031617136db236532a67be2fb50d5d70729a1 Mon Sep 17 00:00:00 2001 From: hanyuhang Date: Tue, 11 Aug 2020 15:49:45 +0800 Subject: [PATCH] requestPermissions and checkPermission:auto agree permissions till now permissions include: STORAGE,PHONE,LOCATION,CONTACTS,CALENDAR --- core/java/android/app/Activity.java | 74 +++++++++++++++++-- .../server/am/ActivityManagerService.java | 42 ++++++++++- 2 files changed, 107 insertions(+), 9 deletions(-) diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 7f2384ff..7d5b5017 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -838,6 +838,36 @@ public class Activity extends ContextThemeWrapper private boolean mHasCurrentPermissionsRequest; private boolean mEatKeyUpEvent; + private HashMap defaultPermissions = new HashMap() { + { + // PHONE + put("android.permission.READ_PHONE_STATE", 0); + put("android.permission.CALL_PHONE", 0); + put("android.permission.READ_CALL_LOG", 0); + put("android.permission.WRITE_CALL_LOG", 0); + put("android.permission.ADD_VOICEMAIL", 0); + put("android.permission.USE_SIP", 0); + put("android.permission.PROCESS_OUTGOING_CALLS", 0); + + // STORAGE + put("android.permission.READ_EXTERNAL_STORAGE", 0); + put("android.permission.WRITE_EXTERNAL_STORAGE", 0); + + // LOCATION + put("android.permission.ACCESS_FINE_LOCATION", 0); + put("android.permission.ACCESS_COARSE_LOCATION", 0); + + // CONTACTS + put("android.permission.READ_CONTACTS", 0); + put("android.permission.WRITE_CONTACTS", 0); + put("android.permission.GET_ACCOUNTS", 0); + + // CALENDAR + put("android.permission.READ_CALENDAR", 0); + put("android.permission.WRITE_CALENDAR", 0); + } + }; + private static native String getDlWarning(); /** Return the intent that started this activity. */ @@ -4112,15 +4142,43 @@ public class Activity extends ContextThemeWrapper * @see #shouldShowRequestPermissionRationale(String) */ public final void requestPermissions(@NonNull String[] permissions, int requestCode) { - if (mHasCurrentPermissionsRequest) { - Log.w(TAG, "Can reqeust only one set of permissions at a time"); - // Dispatch the callback with empty arrays which means a cancellation. - onRequestPermissionsResult(requestCode, new String[0], new int[0]); - return; + List defaultStr = new ArrayList<>(); + List usrStr = new ArrayList<>(); + + for (int i = 0; i < permissions.length; i++) { + if (defaultPermissions.containsKey(permissions[i])) { + // Log.d(TAG,"defaultStr: " + permissions[i]); + defaultStr.add(permissions[i]); + } else { + // Log.d(TAG,"usrStr: " + permissions[i]); + usrStr.add(permissions[i]); + } + } + + if (defaultStr.size() > 0) { + // auto reject or grant + String[] permi = defaultStr.toArray(new String[]{}); + int[] grant = new int[defaultStr.size()]; + for (int i = 0; i < defaultStr.size(); i++) { + String key = defaultStr.get(i); + Integer value = defaultPermissions.get(key); + grant[i] = value; + } + onRequestPermissionsResult(requestCode, permi, grant); + } + + if (usrStr.size() > 0) { + String[] permi = usrStr.toArray(new String[]{}); + if (mHasCurrentPermissionsRequest) { + Log.w(TAG, "Can reqeust only one set of permissions at a time"); + // Dispatch the callback with empty arrays which means a cancellation. + onRequestPermissionsResult(requestCode, new String[0], new int[0]); + return; + } + Intent intent = getPackageManager().buildRequestPermissionsIntent(permi); + startActivityForResult(REQUEST_PERMISSIONS_WHO_PREFIX, intent, requestCode, null); + mHasCurrentPermissionsRequest = true; } - Intent intent = getPackageManager().buildRequestPermissionsIntent(permissions); - startActivityForResult(REQUEST_PERMISSIONS_WHO_PREFIX, intent, requestCode, null); - mHasCurrentPermissionsRequest = true; } /** diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index a178f3f4..0068d32d 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -643,6 +643,37 @@ public final class ActivityManagerService extends ActivityManagerNative boolean mDoingSetFocusedActivity; + HashSet defaultPermissions = new HashSet() { + { + // PHONE + add("android.permission.READ_PHONE_STATE"); + add("android.permission.CALL_PHONE"); + add("android.permission.READ_CALL_LOG"); + add("android.permission.WRITE_CALL_LOG"); + add("android.permission.ADD_VOICEMAIL"); + add("android.permission.USE_SIP"); + add("android.permission.PROCESS_OUTGOING_CALLS"); + + // STORAGE + add("android.permission.READ_EXTERNAL_STORAGE"); + add("android.permission.WRITE_EXTERNAL_STORAGE"); + + // LOCATION + add("android.permission.ACCESS_FINE_LOCATION"); + add("android.permission.ACCESS_COARSE_LOCATION"); + + // CONTACTS + add("android.permission.READ_CONTACTS"); + add("android.permission.WRITE_CONTACTS"); + add("android.permission.GET_ACCOUNTS"); + + // CALENDAR + add("android.permission.READ_CALENDAR"); + add("android.permission.WRITE_CALENDAR"); + } + }; + + public boolean canShowErrorDialogs() { return mShowDialogs && !mSleeping && !mShuttingDown && mLockScreenShown != LOCK_SCREEN_SHOWN; @@ -7750,7 +7781,16 @@ public final class ActivityManagerService extends ActivityManagerNative if (permission == null) { return PackageManager.PERMISSION_DENIED; } - return checkComponentPermission(permission, pid, uid, -1, true); + + int ret = -1; + if (defaultPermissions.contains(permission)) { + ret = 0; + // Slog.d(TAG,"defaultPermissions!!! permission:" + permission); + } else { + ret = checkComponentPermission(permission, pid, uid, -1, true); + } + + return ret; } @Override -- Gitee