最近项目上使用到了百度地图、有导航定位以及最基本的显示地图图层的功能、在开发的时候一直使用 Android 4.4 的手机开发的、一切都是那么的顺利、但是在最后提交给测试的时候发现在 Android 6.0 的手机上面地图显示不出来、查了很多资料都没有想着的解决方案、毕竟 Android 6.0 出来也不久、资料很少
最后只能自己慢慢琢磨了、后来发现在取消订位的代码之后地图图层可以显示出来、那么很显然是定位出问题了、在查阅资料之后发现了、Android 6.0在我们原有的AndroidManifest.xml声明权限的基础上、又新增了运行时权限动态检测、以下权限都需要在运行时判断、简称危险权限、那么显示定位是要用到运行时权限的、下面给出我个人对运行时权限 地理位置 的解决方案、希望对大家有用
1、ANDROID6.0运行时权限列表
日历(CALENDAR)
摄像头(CAMERA)
通讯录(CONTACTS)
地理位置(LOCATION)
麦克风(MICROPHONE)
电话(PHONE)
短信(SMS)
存储空间(STORAGE)
身体传感器(SENSORS)
2、ANDROID 6.0权限判断
我们需要在用到权限的地方、每次都检查是否APP已经拥有权限、比如我用到的定位功能、需要定位之前检测是否有地理位置权限、没有则申请权限、代码如下
if(ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION)!=PackageManager.PERMISSION_GRANTED||ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION)!=PackageManager.PERMISSION_GRANTED){//申请WRITE_EXTERNAL_STORAGE权限ActivityCompat.requestPermissions(this,newString[]{Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION},ACCESS_COARSE_LOCATION_REQUEST_CODE);}else{initMap();}
3、权限提示
请求权限后、系统会弹出请求权限的Dialog、如下图
4、用户允许
用户选择允许或拒绝后、会回调onRequestPermissionsResult方法、 该方法类似于我们平时常用的onActivityResult方法、代码如下
@OverridepublicvoidonRequestPermissionsResult(intrequestCode,String[]permissions,int[]grantResults){super.onRequestPermissionsResult(requestCode,permissions,grantResults);if(requestCode==ACCESS_COARSE_LOCATION_REQUEST_CODE){if(grantResults[0]==PackageManager.PERMISSION_GRANTED){// Permission GrantedinitMap();}else{// Permission DeniedToast.makeText(this,"访问被拒绝!",Toast.LENGTH_SHORT).show();}}}
5、INITMAP方法
privatevoidinitMap(){mBaiduMap=mMapView.getMap();mBaiduMap.setMyLocationConfigeration(newMyLocationConfiguration(mCurrentMode,true,null));// 开启定位图层mBaiduMap.setMyLocationEnabled(true);// 定位初始化mLocClient=newLocationClient(this);mLocClient.registerLocationListener(this);LocationClientOptionoption=newLocationClientOption();option.setOpenGps(true);// 打开gpsoption.setCoorType("bd09ll");// 设置坐标类型option.setScanSpan(1000);mLocClient.setLocOption(option);mLocClient.start();}
6、FRAGMENT中运行时权限的特殊处理
在Fragment中申请权限、不要使用ActivityCompat.requestPermissions, 直接使用Fragment的requestPermissions方法、否则会回调到Activity的 onRequestPermissionsResult
如果在Fragment中嵌套Fragment、在子Fragment中使用requestPermissions方 法、onRequestPermissionsResult不会回调回来、建议使用 getParentFragment().requestPermissions方法
这个方法会回调到父Fragment中的onRequestPermissionsResult、加入以下代码可以把回调透传到子Fragment
@OverridepublicvoidonRequestPermissionsResult(intrequestCode,String[]permissions,int[]grantResults){super.onRequestPermissionsResult(requestCode,permissions,grantResults);Listfragments=getChildFragmentManager().getFragments();if(fragments!=null){for(Fragmentfragment:fragments){if(fragment!=null){fragment.onRequestPermissionsResult(requestCode,permissions,grantResults);}}}}