解决百度地图Android 6.0无法定位的问题_Android 6.0运行时权限处理
2016-06-21 13:12:50  By: dwtedx

最近项目上使用到了百度地图、有导航定位以及最基本的显示地图图层的功能、在开发的时候一直使用 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、如下图

android 6.0 定位权限


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

若资源对你有帮助、浏览后有很大收获、不妨小额打赏我一下、你的鼓励是维持我不断写博客最大动力

想获取DD博客最新代码、你可以扫描下方的二维码、关注DD博客微信公众号(ddblogs)

或者你也可以关注我的新浪微博、了解DD博客的最新动态:DD博客官方微博(dwtedx的微博)

如对资源有任何疑问或觉得仍然有很大的改善空间、可以对该博文进行评论、希望不吝赐教

为保证及时回复、可以使用博客留言板给我留言: DD博客留言板(dwtedx的留言板)

感谢你的访问、祝你生活愉快、工作顺心、欢迎常来逛逛


猜你喜欢的

快速评论


技术评论

  • 该技术还没有评论、赶快抢沙发吧...
DD记账
top
+