android6.0是否获取到权限和运行时请求权限

之前做腾讯地图和二维码扫描遇到的问题,在app装上之后危险权限是需要用户同意后才能获取到权限,然而android6.0不能提示获取,然后需要在使用时该权限时判断是否获取到了权限,再做其他逻辑,


Requesting Permissions at Run Time
从Android6.0(API >= 23)开始,用户在APP运行的时候授予其权限而不是像以前安装的时候就通通授予了(以前授权方式好像没什么卵用)。由于不在需要在安装或更新APP的时候授予相关权限,这就简化了APP的安装过程。这也提高了用户对APP功能的控制,比如:用户可以选择让一个Camera APP使用Camera,用户可以在任何时候在设置面板撤销这个权限。。。
看完是不是有点像我们在国产ROM中常见到的每个应用运行时权限授予。

系统权限也被分城normal和dangerous两类:

  • Normal类的权限不会直接涉及到用户隐私风险。如果APP在Manifest文件中声明了Normal类的权限,系统会自动授予这些权限。
  • Dangerous类的权限可能会让APP涉及到用户机密的数据。如果APP在Manifest文件中声明了Normal类的权限,系统会自动授予这些权限。如果在Manifest文件中添加了Dangerous类的权限,用户必须明确的授予对应的权限后APP才具有这些权限。
    直接上代码

    使用ContextCompat.checkSelfPermission()检查权限,第一个参数是上下文,第二个是相关权限.如果APP有该权限返回PackageManager.PERMISSION_GRANTED,APP接着可以进行对应操作;如果没有权限,以上方法返回PERMISSION_DENIED,APP需要明确的向用户请求授权。Android提供shouldShowRequestPermissionRationale()方法求向用户展示为啥你需要这个权限,当用户之前已经请求过该权限并且拒绝了授权这个方法返回true。
    注意:如果用户拒绝权限请求的时候选择了Don’t ask again选项,上面的方法返回false,当然如果设备本身就不允许有这个权限也是返回false。
    requestPermissions()就是请求权限方法,异步方法。需要三个参数,上下文,需要请求的权限字符串数组,int类型常量请求码,请求码在回调中使用,下面是代码:这里是以相机权限为例子,如果想申请任何运行时权限,在下方ActivityCompat.requestPermissions数组内添加权限。常用的权限   Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.CAMERA

    /**
     * 判断是否获取到相机权限
     */
    if(ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
        if(ActivityCompat.shouldShowRequestPermissionRationale(HuaQiActivity.this,Manifest.permission.CAMERA)) {//是否请求过该权限
    
    
        }else {//没有则请求获取权限,示例权限是:相机权限和定位权限,需要其他权限请更改或者替换
            ActivityCompat.requestPermissions(context,new String[]{Manifest.permission.CAMERA,Manifest.permission.ACCESS_COARSE_LOCATION },REQUESTCODE);
        }
    }else {		//如果已经获取到了权限则直接进行下一步操作
        Intent intent = new Intent(context, CaptureActivity.class);
        startActivityForResult(intent, SCANNIN_GREQUEST_CODE);
    }
    用户点击后允许或拒绝该权限后有回调响应,如果允许会返回值,直接判断

    代码

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case REQUESTCODE:
                if(grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
                    Intent intent = new Intent(context, CaptureActivity.class);
                    startActivityForResult(intent, SCANNIN_GREQUEST_CODE);
                }else {
                    Toast.makeText(HuaQiActivity.this,"您拒绝了获取到相机权限,请手动获取或重装软件",Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }

你可能感兴趣的:(Android,权限android6.0,地图定位,相机权限)