随着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(); } } }