PermissionsDispatcher是一个基于注解、帮助开发者简单处理Android 6.0系统中的运行时权限的开源库。避免了开发者编写大量繁琐的样板代码。
开源地址:https://github.com/hotchemi/PermissionsDispatcher
1 . 添加依赖:
// PermissionsDispatcher
compile("com.github.hotchemi:permissionsdispatcher:3.2.0") {
exclude module: "support-v13"
}
annotationProcessor "com.github.hotchemi:permissionsdispatcher-processor:3.2.0"
注意是把${latest.version}这整个换成最新版本号。
2. 在Activity或Fragment中使用
注解列表:
Annotation | Required | Description |
---|---|---|
@RuntimePermissions | ✓ | 注解在其内部需要使用运行时权限的Activity或Fragment上 |
@NeedsPermission | ✓ | 注解在需要调用运行时权限的方法上,当用户给予权限时会执行该方法 |
@OnShowRationale | 注解在用于向用户解释为什么需要调用该权限的方法上,只有当第一次请求权限被用户拒绝,下次请求权限之前会调用 | |
@OnPermissionDenied | 注解在当用户拒绝了权限请求时需要调用的方法上 | |
@OnNeverAskAgain | 注解在当用户选中了授权窗口中的不再询问复选框后并拒绝了权限请求时需要调用的方法,一般可以向用户解释为何申请此权限,并根据实际需求决定是否再次弹出权限请求对话框 |
注意:被注解的方法不能是私有方法。
第一步:
@RuntimePermissions
注解:这是必须使用的注解,用于标注在你想要申请权限的Activity或者Fragment上,如demo里面的PermissionsDispatcherActivity:
@RuntimePermissions
public class PermissionsDispatcherActivity extends AppCompatActivity implements View.OnClickListener {
}
第二步:
一般常用的几个方法
//需要检查权限的方法
@NeedsPermission({Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA})
void showCamera() {
}
@SuppressLint("NoCorrespondingNeedsPermission")
@OnShowRationale({Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA})
void showRationaleForCamera(PermissionRequest request) {
}
@OnPermissionDenied({Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA})
void showDeniedForCamera() {
Toast.makeText(getActivity(), "您拒绝了权限,该功能不可用", Toast.LENGTH_SHORT).show();
}
@OnNeverAskAgain({Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA})
void showNeverAskForCamera() {
dialogFromBottom.dismiss();
new StyledDialog.Builder(getActivity())
.setMessage("更换头像需要开启权限")
.setPositiveButton("允许", new StyledDialog.OnClickListener() {
@Override
public void onClick() {
intent();
}
})
.setNegativeButton("拒绝", null)
.show();
}
经过以上方法后,再build一次Make project之后,编译器就会在在app\build\intermediates\classes\debug目录下与被注解的Activity同一个包下生成一个辅助类,名称为 “被注解的Activity的名称+PermissionsDispatcher” 的辅助类,用来调用被注解的Activity的方法(就是因为这个所以被注解的方法不能private,private方法的作用域不在其他的类)。所以,第一次用的话,要注解好之后,build一次,下面的方法里面的PermissionsDispatcherActivityPermissionsDispatcher才不会令AS报红。
第三步:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
PermissionsDispatcherActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}
注意
红框部分 添成自己的Activity或Fragent名字
最后:申请权限的时候,调用辅助类的方法就行了
//申请单个权限
PermissionsDispatcherActivityPermissionsDispatcher.getSingleWithCheck(this);
同样换成自己的Activity或Fragent名字