permission
介绍
关于6.0运行时权限认证,使用官网介绍的方式比较繁琐,这里介绍一个开源库AndPermission,它采用链式调用方式,一句话申请所需权限,并且提供对拒绝过的权限自定义RationaleDailog来展示。它还可以方便的跳转到权限设置页面,尽大可能的兼容不同的手机系统。
使用
依赖方式官网介绍很清楚,现在主要说明我们如何使用。给个github传送门https://github.com/yanzhenjie/AndPermission.
先贴代码
AndPermission.with(this)
.runtime()
.permission(Permission.Group.CAMERA)
.rationale(this)//添加拒绝权限回调
.onGranted(new Action<List<String>>() {
@Override
public void onAction(List<String> data) {
// data.get(0);
Log.d("permission", data.get(0));
Intent intent = new Intent(MainActivity.this, CustomCameraActivity.class);
startActivityForResult(intent, 110);
}
})
.onDenied(new Action<List<String>>() {
@Override
public void onAction(List<String> data) {
/**
* 当用户没有允许该权限时,回调该方法
*/
Toast.makeText(MainActivity.this, "没有获取照相机权限,该功能无法使用", Toast.LENGTH_SHORT).show();
/**
* 判断用户是否点击了禁止后不再询问,AndPermission.hasAlwaysDeniedPermission(MainActivity.this, data)
*/
if (AndPermission.hasAlwaysDeniedPermission(MainActivity.this, data)) {
//true,弹窗再次向用户索取权限
showSettingDialog(MainActivity.this, data);
}
}
}).start();
代码还是比较清晰的,链式调用,这里主要说明几个东西permission里面是可以传数组的,也就是可以多个权限认证,权限组也可以。.onDenied是权限被拒绝时的回调,在里面我们还可以通过AndPermission.hasAlwaysDeniedPermission判断用户是否点击了“禁止后不再询问”;onGranted则是授权成功之后的回调,我们可以在这里面做进一步的操作。这是最简单的使用方式。
下面我再介绍下几个方法使用。
AndPermission.with(this)
.runtime()
.setting()
.onComeback(new Setting.Action() {
@Override
public void onAction() {
Toast.makeText(MainActivity.this,"返回", Toast.LENGTH_SHORT).show();
}
})
.start();
这个是andpermission封装了跳转到系统设置页面,我们可以当用户禁止不再询问时,弹窗提示用户去设置里面允许该权限时可以使用该方法进入到系统设置页面。
Rationale接口
可以通过实现Rationale接口重写showRationale方法,这个方法是会在如果用户拒绝过该权限,则下次会走showRationale方法,这里面一般是以一个弹窗方式来提示用户。 .rationale(this)则是设置监听
@Override
public void showRationale(Context context, List<String> data, final RequestExecutor executor) {
List<String> permissionNames = Permission.transformText(context, data);
String message = "请授权该下的权限" + "\n" + permissionNames;
new android.app.AlertDialog.Builder(context)
.setCancelable(false)
.setTitle("提示")
.setMessage(message)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
executor.execute();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
executor.cancel();
}
})
.show();
}
结束
由于本人水平有限,说的不对的地方请谅解留言。