解决百度地图Android 6.0无法定位的问题_Android 6.0运行时权限处理
最近项目上使用到了百度地图、有导航定位以及最基本的显示地图图层的功能、在开发的时候一直使用 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, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, ACCESS_COARSE_LOCATION_REQUEST_CODE); }else { initMap(); }
3、权限提示
请求权限后、系统会弹出请求权限的Dialog、如下图
4、用户允许
用户选择允许或拒绝后、会回调onRequestPermissionsResult方法、 该方法类似于我们平时常用的onActivityResult方法、代码如下
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == ACCESS_COARSE_LOCATION_REQUEST_CODE) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { // Permission Granted initMap(); } else { // Permission Denied Toast.makeText(this, "访问被拒绝!", Toast.LENGTH_SHORT).show(); } } }
5、initMap方法
private void initMap() { mBaiduMap = mMapView.getMap(); mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(mCurrentMode, true, null)); // 开启定位图层 mBaiduMap.setMyLocationEnabled(true); // 定位初始化 mLocClient = new LocationClient(this); mLocClient.registerLocationListener(this); LocationClientOption option = new LocationClientOption(); option.setOpenGps(true); // 打开gps option.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
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); List<Fragment> fragments = getChildFragmentManager().getFragments(); if (fragments != null) { for (Fragment fragment : fragments) { if (fragment != null) { fragment.onRequestPermissionsResult(requestCode,permissions,grantResults); } } } }
android6.0运行时权限Google源代码下载链接: android6.0运行时权限处理 密码: 2n1x