Android 6.0 权限的添加

谈Android 6.0权限之前,我们先说一下6.0 之前的权限,在6.0以前的系统,都是权限一刀切的处理方式,只要用户安装,Manifest申请的权限都会被赋予,并且安装后权限也撤销不了。

这种情况下,当我们从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();
    }

这里权限已经打开,因为是模拟器所以显示的地址并不正确。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值