安卓6.0 的动态权限

     安卓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用户一次

哈哈哈哈哈




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值