android系统的权限问题不管是对用户还是开发者都是一块诟病,针对这个问题android官方终于在6.0的版本上给出方案了,一些危险权限不在是在manifest中注册下就能使用了,全都需要用户亲自确认后才能使用;在6.0之前也有一些手机厂商针对原生的系统做了二次开发,植入自己的rom,其中就有涉及到权限这一块问题;
今天在这里先给大家推荐一个依赖库,大家只要导入该库并在相应获取权限的地方添加调用代码就行,非常的简便,不在需要每个需要权限的页面写回调啦
下载地址:https://github.com/captain-miao/Android_M_requestPermissions
该库的优势:
1.导入配置非常的简单,极大的缩小学习成本,基本拿来就用
2.对一些共用的地方做了封装,比如请求权限后的回调等;
3.针对权限的拒绝比较好的处理,如:自定义弹框跳转app的系统详情页,可以手动去管理权限,清理数据等信息;欠缺的地方:
1.针对多个权限请求结果回调的地方没有返回相应的权限名称和状态,对于一 些需要对单个权限允许授权的业务处理显得不是很友好,还需要通过再查一遍权限请求状态(其实这步是没有必要做的,如果回调中带回来的话);
2.对自定义弹框的配置的默认信息不是很合理,比如:处理拒绝的逻辑都需要在引用的地方自己去配置相关函数,显得有点冗余,个人觉得不是很合理;
3.没有提供“不再提醒”复选框的监听事件,对一些相对不再提醒做处理的码友来说也不是很合理
4.没有提供直接跳转app系统的权限页,仅仅是跳转到详情页(ACTION_APPLICATION_DETAILS_SETTINGS),没有做到一步到位
总而言之:框架设计的还是不错的,针对上面欠缺的地方,码友完全可以拿来进行二次开发,也能节约不少时间和成本;
下面介绍该框架的三个重要的功能使用方式:
1.单个权限请求
private void reqPhonePermisson() {
boolean isGranted = PermissionUtils.hasSelfPermissions(this,
Manifest.permission.READ_PHONE_STATE);
if (isGranted)
return;
CheckPermission.from(this).setPermissions
(Manifest.permission.READ_PHONE_STATE).setPermissionListener
(new PermissionListener() {
@Override
public void permissionGranted() {
}
@Override
public void permissionDenied() {
}
}).check();
}
注:其中setPermissions表示添加权限请求的监听,permissionGranted表示权限被允许,permissionDenied表示权限被拒绝
2.多个权限同时注册的时候,只弹出一个对话框;
private void initData() {
boolean isGranted =PermissionUtils.hasSelfPermissions(this,
dangerousPermissionHome);
if (!isGranted) {
CheckPermission.from(this)..setPermissionListener(new
PermissionListener() {
@Override
public void permissionGranted() {
}
@Override
public void permissionDenied() {
}
}).check();
}
}
注:这里值得注意的是permissionGranted和permissionDenied这两个回调函数都是多个权限全部操作完之后才回执行的,如果你需要对某个权限的请求结果做处理的话,需要自己在回调中再做个权限状态的验证:如PermissionUtils.hasSelfPermissions(this, “某个权限的名称”)
3.权限被拒(包括选中“不再提醒”)后自定义弹框处理;
public void showPermissionDenyDialog(final ArrayList<PermissionBean> deniedPermissions) {
if (TextUtils.isEmpty(denyMessage)) {
// denyMessage
permissionDenied(deniedPermissions);
return;
}
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle(R.string.permission_help);
builder.setMessage(denyMessage)
.setCancelable(false)
.setNegativeButton(deniedCloseButtonText, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
permissionDenied(deniedPermissions);
}
});
if (hasSettingButton) {
builder.setPositiveButton(settingButtonText, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
try {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
.setData(Uri.parse("package:" + packageName));
startActivityForResult(intent, REQ_CODE_REQUEST_SETTING);
} catch (ActivityNotFoundException e) {
e.printStackTrace();
Intent intent = new Intent(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS);
startActivityForResult(intent, REQ_CODE_REQUEST_SETTING);
}
}
});
}
builder.show();
}
针对以上在某种情况下的使用补充:
权限被拒,没有勾选 “不在提示”的复选框(该方框是在第一次被拒之后第二次请求才会出现的,是全局的概念哦,意思就是你同时请求多个权限,第一个被拒之后,直接切换到第二个,这时第二个就会出现“不在提醒”的方框),再次进入该页面的时候还会继续弹框让用户确认,反之,勾选过的就表示用户不同意该权限对app开放,导致的一些app中无法使用的功能,可以弹框告知,然而并不是彻底的就无法再次开启该权限的,可以到应用程序下面找到相应的app,点击进入Permissions一栏,进入权限管理页,如下图:
手动选中所需权限,即可在此开启以前被拒的权限功能
android6.0的权限管理大致介绍至此,希望对需要的人有所帮助