PermissionsDispatcher权限申请

2018-09-04  本文已影响42人  河马过河

一、PermissionsDispatcher使用

1、引用

   implementation 'com.github.hotchemi:permissionsdispatcher:3.3.1'
   annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:3.3.1'

2、权限声明

   <uses-permission android:name="android.permission.CAMERA" />
   <uses-permission android:name="android.permission.READ_CONTACTS" />

3、注解说明

  • @RuntimePermissions注解:这是必须使用的注解,用于标注在你想要申请权限的Activity或者Fragment
  • @NeedsPermission注解:这也是必须使用的注解,用于标注在你要获取权限的方法,注解括号里面有参数,传入想要申请的权限。也就是说你获取了相应的权限之后就会执行这个方法
  • @OnShowRationale注解:这个不是必须的注解,用于标注申请权限前需要执行的方法,注解
    括号里面有参数,传入想要申请的权限,而且这个方法还要传入一个PermissionRequest对象,这个对象有两种方法:proceed()让权限请求继续,cancel()让请求中断。
  • @OnPermissionDenied注解:这个也不是必须的注解,用于标注如果权限请求失败,但是用户没有勾选不再询问的时候执行的方法,注解括号里面有参数,传入想要申请的权限
  • @OnNeverAskAgain注解:这个也不是必须的注解,用于标注如果权限请求失败,而且用户勾选不再询问的时候执行的方法,注解括号里面有参数,传入想要申请的权限

4、复写onRequestPermissionsResult方法

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

总结

①.MainActivityPermissionsDispatcher 这个类是添加完注解后,build工程自动生成的

5、调用申请权限的方法

       MainActivityPermissionsDispatcher.requestPermissionWithPermissionCheck(this);

总结

①.一般在onCreate方法中调用

6、使用用例

@RuntimePermissions
public class MainActivity extends BaseActivity<MainPresenter> implements MainContract.IMainView {
    private static final String TAG = MainActivity.class.getSimpleName();
    @BindView(R.id.btn_main_click)
    Button btn_main_click;
    @BindView(R.id.tv_main_content)
    TextView tv_main_content;
    private int count = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        presenter = new MainPresenter(this);
    }

    @OnClick({R.id.btn_main_click, R.id.btn_main_lifecycle})
    void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_main_click:
                MainActivityPermissionsDispatcher.requestPermissionWithPermissionCheck(this);
                break;
        }
    }


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

    /**
     * 只有全部成功时,才会调用
     */
    @NeedsPermission({Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_CALENDAR})
    public void requestPermission() {
        ToastUtils.showShort("申请权限成功");
    }

    /**
     * 只要有一个权限没有申请成功,且没有选择"以后不再询问",则提示失败
     */
    @OnPermissionDenied({Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_CALENDAR})
    public void requestPermissionDenied() {
        ToastUtils.showShort("申请权限失败");
    }

    /**
     * 申请失败后,再申请则调用
     *
     * @param permissionRequest
     */
    @OnShowRationale({Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_CALENDAR})
    public void requestPermissionShowRationale(final PermissionRequest permissionRequest) {
        new AlertDialog.Builder(this).setMessage("申请读取存储权限")
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {//确定后,则弹出申请权限的提示
                        permissionRequest.proceed();
                    }
                })
                .setNegativeButton("取笑", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {//取消后,调用requestPermissionDenied
                        permissionRequest.cancel();
                    }
                }).show();
    }

    /**
     * 只要有一个申请失败,且选择了"以后不再询问",则提示
     */
    @OnNeverAskAgain({Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_CALENDAR})
    public void requestPermissionNeverAskAgain() {
        ToastUtils.showShort("申请权限失败,且不再提示");
    }

}

总结

①.申请权限,用户选择后,方法调用主次顺序,只会有一个满足。
requestPermission->requestPermissionDenied->requestPermissionNeverAskAgain

二、PermissionsDispatcher插件使用

①、安装插件


1536052104(1).jpg

②、调用插件
快捷键Alt+Insert


1536052190(1).png
③、选择红线标出的选项
1536052311.jpg 河马过河微信公众号.jpg
上一篇 下一篇

猜你喜欢

热点阅读