Android 6.0 权限的添加
程序员文章站
2024-01-22 08:16:46
...
谈Android 6.0权限之前,我们先说一下6.0 之前的权限,在6.0以前的系统,都是权限一刀切的处理方式,只要用户安装,Manifest申请的权限都会被赋予,并且安装后权限也撤销不了。
1.我信任你,即使有敏感权限
2.你一个**应用,要这个权限干嘛,我还是不安装了。
这种情况下,当我们从Google Play安装一个应用,在安装之前会得到这样的权限提示信息。
1.我信任你,即使有敏感权限
2.你一个**应用,要这个权限干嘛,我还是不安装了。
所以,这种一刀切的处理方式还是有弊端的,我们没有办法只允许某些权限或者拒绝某些权限。
那么Android 6.0 问世后,权限发生了那些变化呢?我们先参考下资料:
http://www.cnblogs.com/cr330326/p/5181283.html
https://blog.coding.net/blog/understanding-marshmallow-runtime-permission
http://blog.csdn.net/lmj623565791/article/details/50709663
参考资料得知:其实并不是每一个权限都要动态添加的,我们只对那些危险权限进行动态添加就可以了。比如:获取相机权限 , 获取相册权限 , 定位权限 , 获取联系*限 ,获取短信权限 。。。。。。
那么到底我们应该怎么动态添加权限呢? 我们以定位为例子:
判断编译版本 , 检测应用 请求权限
/**
* 开始定位
*/
private void startLocation() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//SDK>=23 编译版本 > 23
//checkSelfPermission用来检测应用是否已经具有权限
if (!(checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED)) {
if (shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_COARSE_LOCATION)) {
//去设置权限(申请权限) dialog
MySystemUtils.goToSetPermission(activity, getResources().getString(R.string.permission_location), REQ_SET_LOCATION);
} else {
//进行请求单个或多个权限
requestPermissions(new String[]{Manifest.permission.CHANGE_WIFI_STATE, Manifest.permission.ACCESS_COARSE_LOCATION}, REQ_SET_LOCATION);
}
} else {
Log.i("--", "onClick granted");
mLocationClient.startLocation();
}
} else {
mLocationClient.startLocation();
}
}
权限请求的结果:
@Override//权限请求结果 用户对请求作出响应后的回调
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQ_SET_LOCATION) {
waitDialog.dismiss();
Boolean grantResultBoolean = false;
for (int grantResult : grantResults) {
grantResultBoolean = (grantResult == PackageManager.PERMISSION_GRANTED);
if (!grantResultBoolean) {
break;
}
}
if (grantResultBoolean) {
//通过
tv_currently_location.setText(getResources().getString(R.string.location_ing));
mLocationClient.startLocation();
} else {
tv_currently_location.setText(getResources().getString(R.string.location_error));
MySystemUtils.goToSetPermission(activity, getResources().getString(R.string.notice_location), REQ_SET_LOCATION);
}
}
}
弹出dialog 请求权限: /**
* 对于其他的权限,其实申请的逻辑是类似的;唯一不同的肯定就是参数,
* 我们需要3个参数:Activity|Fragment、权限字符串数组、int型申请码。
* 去设置权限(申请权限)
* @param activity
* @param message 显示的信息
* @param req_permission 请求权限的码
*/
public static void goToSetPermission(final Activity activity, String message, final int req_permission){
new AlertDialog.Builder(activity)
.setTitle("权限申请")
.setMessage(message)
.setPositiveButton("去开启", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//根据包名跳转到系统自带的应用程序信息界面
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", activity.getPackageName(), null);
intent.setData(uri);
activity.startActivityForResult(intent,req_permission);
dialog.dismiss();
}
})
.setCancelable(false)
.show();
}
这里权限已经打开,因为是模拟器所以显示的地址并不正确。