本篇文章給大家分享的是有關(guān)深入淺析Android動(dòng)態(tài)權(quán)限的機(jī)制,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
Android6.0以后引入了動(dòng)態(tài)權(quán)限機(jī)制,一些系統(tǒng)權(quán)限的分配需要在app運(yùn)行中進(jìn)行分配,而不只是在AndroidManifest中指定。
本篇將針對動(dòng)態(tài)權(quán)限的底層分配過程進(jìn)行分析(基于Android-6.0.1)。
權(quán)限分配
我們先看一下請求分配權(quán)限的代碼
//frameworks/support/v4/java/android/support/v4/app/ActivityCompat.java public static void requestPermissions(final @NonNull Activity activity, final @NonNull String[] permissions, final int requestCode) { if (Build.VERSION.SDK_INT >= 23) {//對于Android M 以及以上的權(quán)限的分配 ActivityCompatApi23.requestPermissions(activity, permissions, requestCode); } else if (activity instanceof OnRequestPermissionsResultCallback) {//Android M以下的權(quán)限分配 Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { @Override public void run() { //請求分配的權(quán)限結(jié)果,如分配就是PERMISSION_GRANTED final int[] grantResults = new int[permissions.length]; PackageManager packageManager = activity.getPackageManager(); String packageName = activity.getPackageName(); final int permissionCount = permissions.length; //通過包管理的checkPermission來檢驗(yàn)是否分配權(quán)限 for (int i = 0; i < permissionCount; i++) { grantResults[i] = packageManager.checkPermission( permissions[i], packageName); } ((OnRequestPermissionsResultCallback) activity).onRequestPermissionsResult( requestCode, permissions, grantResults); } }); } }