安卓6.0之前对于应用权限的管理是在用户装载app的时候询问一次是否同意应用申请的权限,如果不同意,那么用户就不能继续安装app,而一旦选择了同意那就是同意了app申请的所有权限。这其实对用户是很不友好的,于是在安卓6.0也就是api23,谷歌推出了动态权限,也就是针对那一部分“危险”权限 ,例如定位,读取联系人,在应用使用过程中,随用随申请,用户可以选择
接收或者拒绝,一般也是第一次选择之后,权限就固定下来了。如果后悔了,可以选择去手机的应用权限管理界面进行更改。
当然,这里的权限除了6.0之前那样在manifest文件中声明权限,还需要开发者在代码里进行手动申请的,最后的效果就是在使用某个权限之前向用户发起一个dialog申请权限
因为动态权限申请的context要求是Activity,所以我们一般在要使用到该权限的Activity或者Fragment中进行权限申请。在需要用到权限的地方,先进行是否已经得到权限的判断,这里如果需要多个权限,可以一并判断,只要其中有一个需要的权限还不具备,那么就要进行动态申请。注意:这里的权限申请方法 requestPermissions()的第二个参数是一个数组,也就是说可以一并进行多个权限的申请,如果其中有已经被授权的权限 会被自动忽略
这里以使用百度地图需要的定位权限为例,如果进入了权限申请方法,系统就会弹出一个dialog询问用户是否授权
private void checkLocatePermission() { boolean isGranted= ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED; if(isGranted){ mLocationClient.start(); }else{ ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},REQUEST_CODE); } }
下面是权限申请的回调方法,也就是在用户对弹起的dialog进行了选择之后的回调方法
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode){ case REQUEST_CODE: if(grantResults.length >0 &&grantResults[0]==PackageManager.PERMISSION_GRANTED){ //用户同意授权 mLocationClient.start(); }else{ //用户拒绝授权 ToastUtils.toast(this,"没有定位权限将导致定位失败,用户可以前往应用权限进行设置"); } break; } }
这里如果用户选择了拒绝,那么在下次使用到定位功能的时候,系统就会默认拒绝权限,所以这里可以给用户一个提示,让用户如果需要该功能就去手机的应用权限设置界面重新赋予权限,或者把这个提示放在前面的check方法里,每次要用到这个权限的时候都toast用户一次
哈哈哈哈哈