首先先偷个懒吧,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
public class PermissionsDispatcherActivity extends AppCompatActivity{
}
@NeedsPermission({Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO})
public void testNeedsPermission() {
Toast.makeText(this, "testNeedsPermission", Toast.LENGTH_SHORT).show();
}
@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({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({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'
}