这可能是最直接的Android动态申请权限代码

随着SDK版本的升级。Android程序员避免不了需要把 targetSdkVersion 设置为>=23  这就避免不了涉及到动态申请权限。

如果需要看理论的知识 请搜索其它文章。如果想直接书写代码和解决方式。请继续:

当 targetSdkVersion 设置为>=23时候。设置动态申请权限代码如下。本人以配置高德定位为例。你可根据自己业务场景修改相关需要权限即可:

1、把你需要的权限静态配置在AndroidManifest.xml文件里。。Android 开发人员都懂。。

如图:

2、首先定义需要的变量

/**
  * 需要进行检测的权限数组,这是定位需要的。。其它的请自行修改
  */
 protected String[] totalPermissions = {
         Manifest.permission.ACCESS_COARSE_LOCATION,
         Manifest.permission.ACCESS_FINE_LOCATION,
         Manifest.permission.WRITE_EXTERNAL_STORAGE,
         Manifest.permission.READ_EXTERNAL_STORAGE,
         Manifest.permission.READ_PHONE_STATE
 };
 //检验完成。未获得权限的数据
 private List<String> needPermissions=new ArrayList<>();
//申请权限的回调码
 final int  REQUEST_CODE=1;

3、代码检查权限。如果全部已经有了执行的操作和没有 去申请。注意 这是activity和fragment里申请方法不同。要区分。下面有标识

//清空没授权数组
needPermissions.clear();
//遍历需要申请数组。哪个没有授权。单独添加
for(int i=0;i<totalPermissions.length;i++){
    if(ContextCompat.checkSelfPermission(RequestPerssionActivity.this,totalPermissions[i])!= PackageManager.PERMISSION_GRANTED){
        needPermissions.add(totalPermissions[i]);
    }
}
//如果有未授权数组。单独申请。否则 认为 全部 有权限。。直接进行操作
if(needPermissions.size()>0){
    String[] strings = new String[needPermissions.size()];
    needPermissions.toArray(strings);
    //这是activity里面申请的方法
    ActivityCompat.requestPermissions(this,strings,REQUEST_CODE);
    //注意如果是Framgnet里面申请。要用如下方法。否则回调方法会进入到activity  而不是Fragment。其它地方代码不变
    //fragment.this.requestPermissions(strings,REQUEST_CODE);
}else{//说明有所有权限。。想做啥直接做吧
    //自定义的发起定位的方法,,请改为你自己想要执行的操作
    location.StartMapLocation();
}

4、定义动态申请的回调方法

/**
 * 相关权限请求 回调
 *
 * @param requestCode
 * @param permissions
 * @param paramArrayOfInt
 */
@TargetApi(23)
public void onRequestPermissionsResult(int requestCode,
                                       String[] permissions, int[] paramArrayOfInt) {
    if(requestCode==REQUEST_CODE){//权限回调成功。并且允许的权限和申请的权限数目上相等。直接执行想要的操作
        int tag=0;
        for(int i=0;i<paramArrayOfInt.length;i++){
            if(paramArrayOfInt[i]== PackageManager.PERMISSION_GRANTED){
                tag++;
            }
        }
        if(tag==needPermissions.size()){
            //自定义的发起 定位的方法,请改为你自己想要执行的操作
            location.StartMapLocation();
        }

    }
}
 

猜你喜欢

转载自blog.csdn.net/a872822645/article/details/84142243