一、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插件使用
①、安装插件

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

③、选择红线标出的选项


网友评论