PermissionsDispatcher動態權限支持庫使用筆記

Android6.0谷歌加強了對android權限機制等管理,對敏感權限要動態加載。為了便于管理動態權限,GitHub上出現了好多開發者封裝的動態權限管理庫,PermissionsDispatcher是github上面一個廣受大家喜愛的權限管理庫,做一下筆記方便自己以后使用(該庫支持小米手機)。

@RuntimePermissions

注冊Activity或Fragment來處理權限

@NeedsPermission

注解執行需要一個或多個權限的操作的方法(允許請求權限后,后面要執行的邏輯寫在這里)

@OnShowRationale

注解一個方法,解釋為什么需要許可。它傳入一個PermissionRequest對象,可以用于在用戶輸入時繼續或中止當前的權限請求(這里可以彈出一個對話框讓用戶點擊是否要允許該權限,如果點擊允許,則彈出權限對話框讓用戶選擇。)

@OnPermissionDenied

注釋如果用戶沒有授予權限,則調用該方法( 如果用戶沒有選擇:不再詢問,且拒絕了該權限,則會回調此注解的方法)

@OnNeverAskAgain

注解一個方法,如果用戶選擇讓設備“不再詢問”一個權限,則調用該方法(小米手機因為有自己的動態權限管理機制,拒絕權限后直接走了這個方法)

核心代碼示例:

@RuntimePermissions
public class MainActivity extends AppCompatActivity {
    private static final int CODE_REQUEST_CAMERA_PERMISSIONS = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate (savedInstanceState);
        setContentView (R.layout.activity_main);
        findViewById (R.id.tv).setOnClickListener (new View.OnClickListener () {
            @Override
            public void onClick(View v) {
                MainActivityPermissionsDispatcher.myNCamWithCheck (MainActivity.this);
            }
        });

    }

    @NeedsPermission(Manifest.permission.CAMERA)//允許請求權限后,后面要執行的邏輯寫在這里
    void myNCam() {
        Toast.makeText (this,"權限被允許,本邏輯可以執行了",Toast.LENGTH_LONG).show ();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult (requestCode, permissions, grantResults);
        MainActivityPermissionsDispatcher.onRequestPermissionsResult (this, requestCode, grantResults);
    }

    @OnShowRationale(Manifest.permission.CAMERA)//這里可以彈出一個對話框讓用戶點擊是否要允許該權限,如果點擊允許,則彈出權限對話框讓用戶選擇
    void mySCam(final PermissionRequest request) {
        showRationaleDialog (R.string.permission_camera_rationale, request);
    }

    @OnPermissionDenied(Manifest.permission.CAMERA)//如果用戶沒有選擇:不再詢問,且拒絕了該權限,則會回調此注解的方法
    void myDCam() {
        Toast.makeText (this, R.string.permission_camera_denied, Toast.LENGTH_LONG).show ();
    }

    @OnNeverAskAgain(Manifest.permission.CAMERA)//如果用戶選擇讓設備“不再詢問”一個權限,則調用該方法
    void myACam() {
        Toast.makeText (this, R.string.permission_camera_never_askagain, Toast.LENGTH_SHORT).show ();
        //對話框提示語句仿支付寶提示
        final AlertDialog.Builder mDialog = new AlertDialog.Builder (this);
        mDialog.setTitle ("獲取相機權限");
        mDialog.setMessage ("我們需要獲取相機相關權限,用于拍照;否則,你將無法正常使用本應用\n設置路徑:設置->應用->xxx->權限");
        mDialog.setNegativeButton ("取消", new DialogInterface.OnClickListener () {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                mDialog.create ().dismiss ();

            }
        });
        mDialog.setPositiveButton ("去設置", new DialogInterface.OnClickListener () {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                settingPermissionActivity (MainActivity.this);
            }
        });

        mDialog.show ();
    }

    private void showRationaleDialog(@StringRes int messageResId, final PermissionRequest request) {
        new AlertDialog.Builder (this)
                .setPositiveButton (R.string.button_allow, new DialogInterface.OnClickListener () {
                    @Override
                    public void onClick(@NonNull DialogInterface dialog, int which) {
                        request.proceed ();
                    }
                })
                .setNegativeButton (R.string.button_deny, new DialogInterface.OnClickListener () {
                    @Override
                    public void onClick(@NonNull DialogInterface dialog, int which) {
                        request.cancel ();
                    }
                })
                .setCancelable (false)
                .setMessage (messageResId)
                .show ();
    }

    public static void settingPermissionActivity(Activity activity) {
        //判斷是否為小米系統
        if (TextUtils.equals (BrandUtils.getSystemInfo ().getOs (), BrandUtils.SYS_MIUI)) {
            Intent miuiIntent = new Intent ("miui.intent.action.APP_PERM_EDITOR");
            miuiIntent.putExtra ("extra_pkgname", activity.getPackageName ());
            //檢測是否有能接受該Intent的Activity存在
            List<ResolveInfo> resolveInfos = activity.getPackageManager ().queryIntentActivities (miuiIntent, PackageManager.MATCH_DEFAULT_ONLY);
            if (resolveInfos.size () > 0) {
                activity.startActivityForResult (miuiIntent, CODE_REQUEST_CAMERA_PERMISSIONS);
                return;
            }
        }
        //如果不是小米系統 則打開Android系統的應用設置頁
        Intent intent = new Intent (Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        Uri uri = Uri.fromParts ("package", activity.getPackageName (), null);
        intent.setData (uri);
        activity.startActivityForResult (intent, CODE_REQUEST_CAMERA_PERMISSIONS);
    }
}

重點來了,可以用插件:PermissionsDispatcher plugin

上面代碼手動寫比較繁瑣 androidStudio里面有一個三方插件 可以自動生成注解方法。
在AndroidStudio 添加插件里面搜索:PermissionsDispatcher plugin 安裝重啟AS即可。
具體使用方法下面網址有詳細說明:
https://github.com/shiraji/permissions-dispatcher-plugin

PermissionsDispatcher GitHub地址:

https://github.com/permissions-dispatcher/PermissionsDispatcher

demo地址

https://github.com/momosnail/PermissionDispatcherDemo

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容