详细的文章: https://blog.youkuaiyun.com/s13383754499/article/details/79034758
emmmmmmm,今天的项目里面有动态获取权限,so,就记录今天我学到的关于动态获取权限的知识点。
android6.0有一个动态获取权限框架PermissionDispatcher。
插件
首先先偷个懒吧,AS里面有快捷的方式可以添加代码,那就是装插件。
装插件流程:settings —> plugins —>搜索:输入PermissionDispatcher —>点击安装 —>重启AS
添加:需添加获取权限的类里面右键 —> Generate —> Generate Runtime Permissions…/Add PermissionsDispatcher dependencies —> 选择你想要添加的权限(如下图)—> 点击Generate —>自动生成
具体注解解析
PermissionDispatcher主要有以下几个注解:
(注意:被注解的方法不能是私有方法!!!)原因:使用PermissionsDispatcher除实现注解还需重写Activity的onRequestPermissionsResult()方法,在里面让一个PermissionsDispatcher执行回调。
1. @RuntimePermissions 标记需要运行时判断的类
2. @NeedsPermission 标记需要检查权限的方法
3. @OnShowRationale 授权提示回调
4. @OnPermissionDenied 授权被拒绝回调
5. @OnNeverAskAgain 授权不再拒绝不再显示回调
- @RuntimePermissions :必须使用的注解,用于标注想申请权限的Activity/Fragment的类名前。
@RuntimePermissions
public class PermissionsDispatcherActivity extends AppCompatActivity{
}
- @NeedsPermission(想要获取的权限…可以多个):必须使用的注解,当用户给予权限时会执行该方法。
@NeedsPermission({Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO})
public void testNeedsPermission() {
Toast.makeText(this, "testNeedsPermission", Toast.LENGTH_SHORT).show();
}
- @OnShowRationale(想要获取的权限…可以多个):非必须的注解,向用户解释为什么需要这个权限的方法上,申请权限前要执行的方法,要传入一个PermissionRequest对象。
@OnShowRationale({Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO})
//给用户解释要请求什么权限,为什么需要此权限
void showRationale(final PermissionRequest request) {
new AlertDialog.Builder(this)
.setMessage("使用此功能需要WRITE_EXTERNAL_STORAGE和RECORD_AUDIO权限,下一步将继续请求权限")
.setPositiveButton("下一步", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
request.proceed();//继续执行请求
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
request.cancel();//取消执行请求
}
}).show();
}
- @OnPermissionDenied(想要获取的权限…可以多个):非必须的注解,用户禁止授权时调用
/**
* 用户禁止授权时调用
*/
@OnPermissionDenied({Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA})
void showDeniedPermission() {
finish();
}
- @OnNeverAskAgain(想要获取的权限…可以多个):非必须的注解,用户勾选不再提示授权和禁止授权时调用,可以在这个方法做申请权限失败并选择不再询问之后的处理。
/**
* 用户勾选不再提示授权和禁止授权时调用
*/
@OnNeverAskAgain({Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA})
void showNeverAskForPermission() {
Toast.makeText(this, "权限被禁止,请在应用管理开启权限。", Toast.LENGTH_SHORT).show();
}
添加依赖
AS引入使用需要在项目的build.gradle添加:
buildscript {
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
在app Module的build.gradle添加:
apply plugin: 'android-apt'
dependencies {
implementation 'com.github.hotchemi:permissionsdispatcher:2.3.1'
annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:2.3.1'
}