这两个权限都被定义在 android源码目录\frameworks\base\data\etc\platform.xml
SnapdragonMusic
@ubuntu-server:~$ grep -rsn "checkAndRequestPermission" android/packages/apps/SnapdragonMusic/
android/packages/apps/SnapdragonMusic/src/com/android/music/VideoBrowserActivity.java:82: if (PermissionActivity.checkAndRequestPermission(this, REQUIRED_PERMISSIONS)) {
android/packages/apps/SnapdragonMusic/src/com/android/music/MusicBrowserActivity.java:111: if (PermissionActivity.checkAndRequestPermission(this, REQUIRED_PERMISSIONS)) {
PermissionActivity.java
public static boolean checkAndRequestPermission(Activity activity, String[] permissions) {
String[] neededPermissions = checkRequestedPermission(activity, permissions);
if (neededPermissions.length == 0) {
return false;
} else {
Intent intent = new Intent();
intent.setClass(activity, PermissionActivity.class);
intent.putExtra(REQUEST_PERMISSIONS, permissions);
intent.putExtra(PERVIOUS_INTENT, activity.getIntent());
activity.startActivity(intent);
activity.finish();
return true;
}
}
private static String[] checkRequestedPermission(Activity activity, String[] permissionName) {
boolean isPermissionGranted = true;
List<String> needRequestPermission = new ArrayList<String>();
for (String tmp : permissionName) {
isPermissionGranted = (PackageManager.PERMISSION_GRANTED ==
activity.checkSelfPermission(tmp));
if (!isPermissionGranted) {
needRequestPermission.add(tmp);
}
}
String[] needRequestPermissionArray = new String[needRequestPermission.size()];
needRequestPermission.toArray(needRequestPermissionArray);
return needRequestPermissionArray;
}
onCreate(){
requestPermissions(){}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults) {
boolean isAllPermissionsGranted = true;
if (requestCode != REQUEST_CODE || permissions == null || grantResults == null ||
permissions.length == 0 || grantResults.length == 0) {
isAllPermissionsGranted = false;
} else {
for (int i : grantResults) {
if (i != PackageManager.PERMISSION_GRANTED)
isAllPermissionsGranted = false;
}
}
if(isAllPermissionsGranted) {
if (mPreviousIntent != null)
startActivity(mPreviousIntent);
finish();
} else {
showMissingPermissionDialog();
}
}
ContextImpl.java
public int checkSelfPermission(String permission) {
if (permission == null) {
throw new IllegalArgumentException("permission is null");
}
return checkPermission(permission, Process.myPid(), Process.myUid());
}
public int checkPermission(String permission, int pid, int uid) {
if (permission == null) {
throw new IllegalArgumentException("permission is null");
}
try {
return ActivityManagerNative.getDefault().checkPermission(
permission, pid, uid);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
ActivityManagerService.java
public int checkPermission(String permission, int pid, int uid) {
if (permission == null) {
return PackageManager.PERMISSION_DENIED;
}
return checkComponentPermission(permission, pid, uid, -1, true);
}
int checkComponentPermission(String permission, int pid, int uid,
int owningUid, boolean exported) {
if (pid == MY_PID) {
return PackageManager.PERMISSION_GRANTED;
}
return ActivityManager.checkComponentPermission(permission, uid,
owningUid, exported);
}
ActivityManager.java
checkComponentPermission(){
return AppGlobals.getPackageManager().checkUidPermission(permission, uid);
}
---------------------------------------------------------------------
Activity.java
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;
}
Intent intent = getPackageManager().buildRequestPermissionsIntent(permissions);
startActivityForResult(REQUEST_PERMISSIONS_WHO_PREFIX, intent, requestCode, null);
mHasCurrentPermissionsRequest = true;
}
PackageManager.java
public Intent buildRequestPermissionsIntent(@NonNull String[] permissions) {
if (ArrayUtils.isEmpty(permissions)) {
throw new IllegalArgumentException("permission cannot be null or empty");
}
Intent intent = new Intent(ACTION_REQUEST_PERMISSIONS);
intent.putExtra(EXTRA_REQUEST_PERMISSIONS_NAMES, permissions);
intent.setPackage(getPermissionControllerPackageName());
return intent;
}
/packages/apps/PackageInstaller/AndroidManifest.xml:84: <action android:name="android.content.pm.action.REQUEST_PERMISSIONS" />
GrantPermissionsActivity.java
public void onCreate(Bundle icicle) {
if (DeviceUtils.isTelevision(this)) {
mViewHandler = new com.android.packageinstaller.permission.ui.television
.GrantPermissionsViewHandlerImpl(this).setResultListener(this); //mResultListener.onPermissionGrantResult
} else if (DeviceUtils.isWear(this)) {
mViewHandler = new GrantPermissionsWatchViewHandler(this).setResultListener(this);
} else {
mViewHandler = new com.android.packageinstaller.permission.ui.handheld
.GrantPermissionsViewHandlerImpl(this).setResultListener(this);
}
setContentView(mViewHandler.createView());//GrantPermissionsViewHandler
}
public void onPermissionGrantResult(String name, boolean granted, boolean doNotAskAgain) {
GroupState groupState = mRequestGrantPermissionGroups.get(name);
if (groupState != null && groupState.mGroup != null) {//zhouyiwang modify for bug 137472 at 20170215
if (granted) {
groupState.mGroup.grantRuntimePermissions(doNotAskAgain);
groupState.mState = GroupState.STATE_ALLOWED;
} else {
groupState.mGroup.revokeRuntimePermissions(doNotAskAgain);
groupState.mState = GroupState.STATE_DENIED;
}
updateGrantResults(groupState.mGroup);
}
if (!showNextPermissionGroupGrantRequest()) {
setResultAndFinish();
}
}
private void setResultAndFinish() {
setResultIfNeeded(RESULT_OK);
finish();
}
private void setResultIfNeeded(int resultCode) {
if (!mResultSet) {
mResultSet = true;
logRequestedPermissionGroups();
Intent result = new Intent(PackageManager.ACTION_REQUEST_PERMISSIONS);
result.putExtra(PackageManager.EXTRA_REQUEST_PERMISSIONS_NAMES, mRequestedPermissions);
result.putExtra(PackageManager.EXTRA_REQUEST_PERMISSIONS_RESULTS, mGrantResults);
setResult(resultCode, result);
}
}
final class GrantPermissionsWatchViewHandler extends ConfirmationViewHandler
implements GrantPermissionsViewHandler {
public View createView() {
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "createView()");
}
mShowDoNotAsk = false;
return super.createView();
}
private void onClick(boolean granted, boolean doNotAskAgain) {
if (mResultListener != null) {
mResultListener.onPermissionGrantResult(mGroupName, granted, doNotAskAgain);
}
}
}
ConfirmationViewHandler.java
public View createView() {
mRoot = LayoutInflater.from(mContext).inflate(R.layout.confirmation_dialog, null);
Button horizontalAllow = (Button) mRoot.findViewById(R.id.permission_allow_button);
Button horizontalDeny = (Button) mRoot.findViewById(R.id.permission_deny_button);
horizontalAllow.setOnClickListener(this);
horizontalDeny.setOnClickListener(this);
return mRoot;
}
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.permission_allow_button:
case R.id.vertical_button1:
onButton1();
break;
case R.id.permission_deny_button:
case R.id.vertical_button2:
onButton2();
break;
case R.id.vertical_button3:
onButton3();
break;
}
}
public void startActivityForResult(
String who, Intent intent, int requestCode, @Nullable Bundle options) {
Uri referrer = onProvideReferrer();
if (referrer != null) {
intent.putExtra(Intent.EXTRA_REFERRER, referrer);
}
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, who,
intent, requestCode, options);//setResult的返回
if (ar != null) {
mMainThread.sendActivityResult(
mToken, who, requestCode,
ar.getResultCode(), ar.getResultData());
}
cancelInputsAndStartExitTransition(options);
}
ActivityThread.java
public final void sendActivityResult(
IBinder token, String id, int requestCode,
int resultCode, Intent data) {
if (DEBUG_RESULTS) Slog.v(TAG, "sendActivityResult: id=" + id
+ " req=" + requestCode + " res=" + resultCode + " data=" + data);
ArrayList<ResultInfo> list = new ArrayList<ResultInfo>();
list.add(new ResultInfo(id, requestCode, resultCode, data));
mAppThread.scheduleSendResult(token, list);
}
public final void scheduleSendResult(IBinder token, List<ResultInfo> results) {
ResultData res = new ResultData();
res.token = token;
res.results = results;
sendMessage(H.SEND_RESULT, res);
}
case SEND_RESULT:
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityDeliverResult");
handleSendResult((ResultData)msg.obj);
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
break;
deliverResults(r, res.results){
r.activity.dispatchActivityResult(ri.mResultWho,ri.mRequestCode, ri.mResultCode, ri.mData);
}
Activity.java
dispatchActivityResult(){
dispatchRequestPermissionsResult();
}
private void dispatchRequestPermissionsResult(int requestCode, Intent data) {
mHasCurrentPermissionsRequest = false;
// If the package installer crashed we may have not data - best effort.
String[] permissions = (data != null) ? data.getStringArrayExtra(
PackageManager.EXTRA_REQUEST_PERMISSIONS_NAMES) : new String[0];
final int[] grantResults = (data != null) ? data.getIntArrayExtra(
PackageManager.EXTRA_REQUEST_PERMISSIONS_RESULTS) : new int[0];
onRequestPermissionsResult(requestCode, permissions, grantResults);
}