运行时权限

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lf12345678910/article/details/56287435

这两个权限都被定义在 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;
        }
    }

扫描二维码关注公众号,回复: 6172958 查看本文章

    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);
    }

猜你喜欢

转载自blog.csdn.net/lf12345678910/article/details/56287435