大家都知道,Android在6.0之前的权限一般都是在Manifest.xml文件中配置了就可以了,但是谷歌6.0对于权限作了比较大的更改,现在不仅要在Manifest.xml中添加相应的权限,同时还需要在代码中动态添加权限申请,否则会出现app崩溃问题。
1.动态申请权限
private List<String> permissionList = new ArrayList<>();//用于存放需要授权的权限
private PermissionListener mPermissionListener;//授权回调监听
public void CheckRequestPermission(String[] permissions, PermissionListener listener) {
this.mPermissionListener = listener;
permissionList.clear();//每次申请之前清空之前的权限
for (String permission : permissions) {
int checkSelfPermission = ContextCompat.checkSelfPermission(this, permission);
if (checkSelfPermission != PackageManager.PERMISSION_GRANTED) {//权限检测
permissionList.add(permission);//将需要申请的权限加入列表中
}
}
if (permissionList.isEmpty()) {//true 权限已开启
mPermissionListener.permissionSuccess();
} else {
ActivityCompat.requestPermissions(this, permissionList.toArray(new
String[permissionList.size()]), REQUEST_CODE_PERMISSION);//权限申请
}
}
//权限申请的回调
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE_PERMISSION:
for (int grantResult : grantResults) {
if (grantResult != PackageManager.PERMISSION_GRANTED) {
mPermissionListener.permissionFail();
return;
}
}
mPermissionListener.permissionSuccess();
break;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
2.但是,会有这样一种情况,假如targetsdkversion 版本小于23,但是手机版本大于6.0,而且手机方案商(小米就是一例)对于一些手机的权限默认是询问的,所以也需要动态获取权限,但是用上面这种方法对于现在这种情况并不适用,所以也是非常伤脑筋,最后在还是找到了答案,也是同样动态申请,但是它是在support-v4包下PermissionChecker类中:
public void CheckRequestPermission(String[] permissions, PermissionListener listener) {
this.mPermissionListener = listener;
int selfPermission = PermissionChecker.checkSelfPermission(this, permissions[0]);
if (selfPermission == PermissionChecker.PERMISSION_GRANTED) {
listener.permissionSuccess();
} else {
listener.permissionFail();
}
}