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 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

你可能感兴趣的:(PermissionsDispatcher动态权限支持库使用笔记)