欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  技术分享

解决百度地图Android 6.0无法定位的问题_Android 6.0运行时权限处理

程序员文章站 2022-02-16 11:56:25
...

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