欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android 6.0 权限的添加

程序员文章站 2024-01-22 08:16:46
...
谈Android 6.0权限之前,我们先说一下6.0 之前的权限,在6.0以前的系统,都是权限一刀切的处理方式,只要用户安装,Manifest申请的权限都会被赋予,并且安装后权限也撤销不了。

这种情况下,当我们从Google Play安装一个应用,在安装之前会得到这样的权限提示信息。

Android 6.0 权限的添加

当上述对话框弹出后,用户只有两种选择:
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();
    }

Android 6.0 权限的添加

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