目录
Android6.0以上的需要进行动态申请权限,由于原生的请求方法使用过于复杂,所以后来涌现出大量的权限检查框架,有基于apt技术的,有基于rxjava技术的,有基于ioc技术的,这里我给大家推荐的是google官方推荐的easypermissions,我自己在项目中也多次使用过,感觉很方便,符合各种应用场景,此库是谷歌推荐的权限申请库,放心大胆的使用吧
在模块的的build.gradle中添加以下代码。
implementation 'pub.devrel:easypermissions:0.3.0'
然后在需要进行权限请求的activity中实现 EasyPermissions.PermissionCallbacks接口
public class WelcomeActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks {
private static final int PERMISSION_CODE = 10000;
private static final int REQUEST_CODE = 10001;
private static final int HANDLER_DELAYED = 1000;
private final String[] permissions = {Manifest.permission.SEND_SMS, Manifest.permission.CALL_PHONE,
Manifest.permission.CAMERA, Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 版本判断。当手机系统大于 23 时,才有必要去动态申请权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions();
}
}
/**
* 申请权限的方法这个是自定义的
*/
private void requestPermissions() {
//判断有没有权限
if (EasyPermissions.hasPermissions(this, permissions)) {
// 如果有权限了, 就做你该做的事情
} else {
// 如果没有权限, 就去申请权限
// this: 上下文
// Dialog显示的正文
// PERMISSION_CODE 请求码, 用于回调的时候判断是哪次申请
// perms 就是你要申请的权限
EasyPermissions.requestPermissions(this, "亲爱的用户,禁用权限可能会导致您的某些功能无法正常使用", R.string.ok, R.string.cancel, PERMISSION_CODE, permissions);
}
}
//系统的权限结果返回回调,此方法一定要实现
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
//权限申请成功的回调
@Override
public void onPermissionsGranted(int requestCode, List perms) {
//这里是根据perms的大小来判断用户把所有的权限都赋予了
if (perms.size() >= 6) {
//执行代码
}
}
//权限申请失败的回调
@Override
public void onPermissionsDenied(int requestCode, List perms) {
if (requestCode != PERMISSION_CODE) {
return;
}
//判断用户是否点击了不在提醒
if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
new AppSettingsDialog.Builder(this)
.setTitle("权限已经被您拒绝")
.setRationale("可能会导致您的某些功能不能正常使用,前往设置打开权限")
.setPositiveButton("前往设置")
.setNegativeButton("取消")
.setRequestCode(REQUEST_CODE)//用于onActivityResult回调做其它对应相关的操作
.build()
.show();
} else {
//这里需要注意的是如果用户把所有的权限都拒绝了,就给出提示框
if (perms.size() >= 6) {
new AppSettingsDialog.Builder(this)
.setTitle("权限已经被您拒绝")
.setRationale("可能会导致您的某些功能不能正常使用,前往设置打开权限")
.setPositiveButton("前往设置")
.setNegativeButton("取消")
.setRequestCode(REQUEST_CODE)//用于onActivityResult回调做其它对应相关的操作
.build()
.show();
} else {
如果用户没有全部拒绝那么就再次请求权限
requestPermissions();
}
}
}
//从系统设置界面返回的回调
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE) {
//执行代码
}
}
}
@AfterPermissionGranted
注解为了提供方便,是可选的。
使用了该注解,当权限请求被用户同意后,会根据请求code来执行,相应的含有@AfterPermissionGranted注解的方法。
简化了请求成功操作流程,不需要在EasyPermissions.onRequestPermissionsResult()的回调监听器中请求成功的方法中,再次手动调用,获取权限后需要操作的逻辑代码。
以下代码,请求电话权限,当用户同意权限后,弹出一个Toast弹窗的逻辑处理操作。
@AfterPermissionGranted(Manifest.permission.CALL_PHONE) 是可选的
public void onPermissionsSuccess() {
ToastUtils.showToast(getApplicationContext(), "用户授权成功");
}
使用了此注解的方法在权限申请成功后都会被回调