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

来源:互联网 发布:linux dd u盘启动盘 编辑:程序博客网 时间:2024/06/09 11:18

之前做腾讯地图和二维码扫描遇到的问题,在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类型常量请求码,请求码在回调中使用,下面是代码

    /** * 判断是否获取到相机权限 */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},REQUESTCODE);    }}else {//如果已经获取到了权限则直接进行下一步操作    Intent intent = new Intent(context, CaptureActivity.class);    startActivityForResult(intent, SCANNIN_GREQUEST_CODE);}
    用户点击后允许或拒绝该权限后有回调响应,如果允许会返回值,直接判断

    代码

    @Overridepublic 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;    }}



  • 1 1