自学安卓编程权威指南(二十七)

一.获取运行时权限

处理运行时权限需要做三件事,(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按钮给予授权,那么除非卸载或是关闭权限,不然应用就会一直拥有着该授权,如果拒绝,那么只是暂时拒绝,下一次再按时,授权对话框还是会跳出来的

猜你喜欢

转载自blog.csdn.net/weixin_41673515/article/details/90415114
今日推荐