一.获取运行时权限
处理运行时权限需要做三件事,(1)确保是不是有权限(2)获取使用权限,如果还没有的话(3)监听权限请求反馈
(1)首先我们取得权限信息,打开我们所需要的那个碎片的类,添加一个常量数组,列出应用需要的全部权限
private static final String[] LOCATION_PERMISSIONS = new String[]{
Manifest.permission.ACCESS_FIME_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
};
上面的权限和在AndroidManifest里面的权限是一样的,下一步是来请求这些权限
对于权限安全类型来说,是赋予权限组的,而不是单个权限,权限组包含各类具体的使用权,授予权限组里面的单一权限时,同组内的其他所有的权限都会获得授权,所以当两个权限是属于同一个权限组时,我们就简单去申请其中一个权限就可以了
(2)编写一个方法,确认是不是可以取得LOCATION_PERMISSIONS数组里面的第一个权限
private boolean hasLocationPermission(){
int result = ContextComp.checkSelfPermission(getActivity(),LOCATION_PERMISSIONS[0]);
return result == PackageManager.PERMISSION_GRANTED;
}
然后我们就需要在findImage()方法之前去调用上面的方法
if(hasLocationPermission()) {
findimage();
}
(3)如果权限检查不通过,那么就调用requestPermission()方法来请求授权
//添加一个授权码
private static final int REQUEST_PERMISSIONS = 0;
if(hasLocationPermission()) {
findimage();
}else{
requestPermissions(LOCATION_PERMISSIONS,REQUEST_PERMISSIONS);
}
requestPermissions()是一个异步请求方法,调用它之后,Android就会弹出系统权限授权对话框来要求用户反馈,为了响应用户操作,我们还需要编写一个onRequestPermissionsResult()响应方法,当用户点击ALLOW或是DENY按钮后,Android就会调用这个回调方法,再次检查授权结果,如果用户给予授权,那么就调用findImage()方法
public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults) {
switch(requestCode) {
case REQUEST_LOCATION_PERMISSIONS:
if(hasLocationPermission()) {
findImage();
}
default:
super.onRequestPermissionsResult(requestCode,permissions,grantResults);
}
}
对于上面的参数grantResults,如果愿意也可以查看这个参数值来确认授权结果,但是从上面的代码中,我们可以看出,我们采用了更加方便的方式,调用hasLocationPermission()方法时,它里面的checkSelfPermission()方法会给出授权结果,所以再一次调用gasLocationPermission()方法就可以
如果我们按了ALLOW按钮给予授权,那么除非卸载或是关闭权限,不然应用就会一直拥有着该授权,如果拒绝,那么只是暂时拒绝,下一次再按时,授权对话框还是会跳出来的