Android6.0运行时权限-----AndPermission的使用

最近才开始用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(List grantedPermissions) {
    // TODO 申请权限成功。
}

可以看到这里的实现方法非常巧妙,使用了注解@PermissionYes(100)这里的100就是申请权限时的请求码,用于区分同一个Activity中不同的权限请求,这样实现就十分简洁清晰了。


最后我们来看看获取权限失败的回调:

// 失败回调的方法,用注解即可,里面的数字是请求时的requestCode。
@PermissionNo(100)
private void getDefeated(List deniedPermissions) {
    // 用户否勾选了不再提示并且拒绝了权限,那么提示用户到设置中授权。
    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(List grantedPermissions) {
    // 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的每一次进步,都对我们开发者虽然眼前吃点苦,但长期来看也是有很大好处的,也就可以很愉快地接受了这个现实。


这是通过网络上收集写完的,各位大神如果有好的文章,欢迎推荐,先谢谢大神们了!








你可能感兴趣的:(Android基础)