最近才开始用AndPermission库,感觉非常不错,在使用的过程中,顺便就将它的用法写下来吧。
首先是AndPermission库的引入,通过添加依赖即可:
dependencies { ... compile 'com.yanzhenjie:permission:1.0.4' }也可以在Project Strcuture里搜索这个依赖库,直接添加。
然后看他如何判断是否有某权限,这里就用读短信为例,看代码:
if(AndPermission.hasPermission(this, Manifest.permission.READ_SMS)){ //执行业务 }else { //申请权限 }这行代码的语义感非常强,就是判断是否有读取短信的权限,第一个参数是上下文对象 ,在Activity中直接传入This,这个方法返回一个Boolean型的值,当返回值 为Ture时可以直接执行业务逻辑,当为False时再执行请求用户极权的逻辑。
接下来看在未获得权限时,如何云请求用户授权
//申请权限 AndPermission.with(this) .requestCode(100) .permission(Manifest.permission.READ_SMS) .send();
这里使用链式编程,requestCode方法里面接受一个int值,作为请求码,用于区分不同的权限请求,permission方法里面的参数可以写一个或多个权限,中间以逗号隔开而不使用数组大括号,然后调用send方法云请求权限。
然后在Activity或Fragment重写onRequestPermissionsResult方法为当前Activity或Fragment设置监听回调,这里和带近回值 的Intent需要重写onActviityResult来设置回调监听类,代码如下:
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { //只需要调用这一句,第一个参数是当前Activity/Fragment,回调方法写在当前Activity/Fragment AndPermission.onRequestPermissionsResult(this,requestCode,permissions,grantResults); }
通过代友我们可以知道,这里就是将回调监听传递给了AndPermission。
下面我们来看看获取权限成功的回调:
// 成功回调的方法,用注解即可,里面的数字是请求时的requestCode。 @PermissionYes(100) private void getSucceed(ListgrantedPermissions) { // TODO 申请权限成功。 }
可以看到这里的实现方法非常巧妙,使用了注解@PermissionYes(100)这里的100就是申请权限时的请求码,用于区分同一个Activity中不同的权限请求,这样实现就十分简洁清晰了。
最后我们来看看获取权限失败的回调:
// 失败回调的方法,用注解即可,里面的数字是请求时的requestCode。 @PermissionNo(100) private void getDefeated(ListdeniedPermissions) { // 用户否勾选了不再提示并且拒绝了权限,那么提示用户到设置中授权。 if (AndPermission.hasAlwaysDeniedPermission(this, deniedPermissions)) { // 第一种:用默认的提示语。 AndPermission.defaultSettingDialog(this, 1).show(); } }
当权限被 用户拒绝的 时候你可以根据实际情况,可以提示用户一些功能无法使用,或者直接拒绝用户进行下一步操作,或者直接良出APP,这里AndPermission做了一个很好的细节就是当用户拒绝权限并且勾选了不再提示时,会默认提示用户可以云设置里面更改设置权限,并且让用户直接跳转到设置界面去打开权限,这里做的就非常友好了、
下面附录一个完整的例子,可以梳理一下思路,也可以直接略过:
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(AndPermission.hasPermission(this,Manifest.permission.READ_SMS,Manifest.permission.READ_CALENDAR, Manifest.permission.CAMERA,Manifest.permission.GET_ACCOUNTS, Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.RECORD_AUDIO, Manifest.permission.CALL_PHONE,Manifest.permission.BODY_SENSORS, Manifest.permission.READ_EXTERNAL_STORAGE)){ //执行业务 }else { //申请权限 AndPermission.with(this) .requestCode(100) .permission(Manifest.permission.READ_SMS,Manifest.permission.READ_CALENDAR, Manifest.permission.CAMERA,Manifest.permission.GET_ACCOUNTS, Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.RECORD_AUDIO, Manifest.permission.CALL_PHONE,Manifest.permission.BODY_SENSORS, Manifest.permission.READ_EXTERNAL_STORAGE) .send(); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { //只需要调用这一句,第一个参数是当前Activity/Fragment,回调方法写在当前Activity/Fragment AndPermission.onRequestPermissionsResult(this,requestCode,permissions,grantResults); } // 成功回调的方法,用注解即可,里面的数字是请求时的requestCode。 @PermissionYes(100) private void getSucceed(ListgrantedPermissions) { // TODO 申请权限成功。 ToastUtils.showToast(this,"已允许权限"); } // 失败回调的方法,用注解即可,里面的数字是请求时的requestCode。 @PermissionNo(100) private void getDefeated(List deniedPermissions) { // 用户否勾选了不再提示并且拒绝了权限,那么提示用户到设置中授权。 if (AndPermission.hasAlwaysDeniedPermission(this, deniedPermissions)) { //用默认的提示语。 AndPermission.defaultSettingDialog(this, 1).show(); } ToastUtils.showToast(this,"请设置相关权限"); }
可以看到运行时权限无非就是:权限判断,权限申请,授权监听,有权逻辑,无权提示这五步,代码量是比以前增加不少,还好危险权限相对不多,也可以集中申请,用时判断;在考虑到Android的每一次进步,都对我们开发者虽然眼前吃点苦,但长期来看也是有很大好处的,也就可以很愉快地接受了这个现实。
这是通过网络上收集写完的,各位大神如果有好的文章,欢迎推荐,先谢谢大神们了!