您的位置:首页 > 移动开发 > Android开发

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

2016-09-01 16:00 141 查看
之前做腾讯地图和二维码扫描遇到的问题,在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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息