百度地图Android SDK使用及注意事项

前言

本文不会过度介绍百度地图SDK的Api使用,更多地介绍遇到的一些问题与注意事项。

一、百度地图SDK相关资源

第一步必然是注册登录账号(只要有百度账号就OK),获取百度地图SDK及文档,地址如下:
[百度地图开放平台][1],文档及SDK资源都在这里啦。
[1]: http://lbsyun.baidu.com/
下载页面如下:

百度地图Android SDK使用及注意事项_第1张图片
百度地图SDK下载页面

建议按照所需功能下载相应的SDK,以免出现缺包及冲突的现象发生。

二、创建应用

这一步很关键,因为涉及到获取Appkey和设置密钥。如果没有配置好应用,地图是无法成功加载的。

1.进入官网-控制台-点击“创建应用”

页面如下:


百度地图Android SDK使用及注意事项_第2张图片
创建应用

接着填写应用名称,选择应用类型,然后选择启用服务(默认全选,如果不确定的话,就全选吧)。

2.配置包名及SHA1值

当我们选择应用类型为Android SDK,会出现如下页面:

百度地图Android SDK使用及注意事项_第3张图片
这里写图片描述

我们发现需要填写发布版SHA1,开发版SHA1及包名,包名好解决(就是我们app的包名,从项目的清单文件里就能找到),但是这两个SHA1 是什么呢?点击“查看详细配置方法”,我们一探究竟。
打开页面之后你会发现,百度关于如何获取SHA1已经介绍的很清楚了。主要采取第一种方法, 通过命令行,使用keytool获取 ** ,定位到.adnroid目录,输入keytool -list -v -keystore debug.keystore,这时需要输入密钥口令(密钥口令默认是android),会得到三种指纹证书,选取SHA1类型的证书,复制填入到开发版的SHA1。
获取开发版的方法与其类似,只需要定位到项目的签名文件目录,在命令行输入keytool -list -v -keystore 签名文件名 输入创建签名文件时设置的密钥口令,就能获取到此签名的SHA1,然后填入发布版SHA1即可,得到SHA1界面如下:
百度地图Android SDK使用及注意事项_第4张图片
获取SHA1

点击提交之后,我们就可看到控制台里就有我们刚刚创建的应用(这时就能看到appkey,简称
AK ),注意AK**值,之后将会用到。

三、百度地图SDK

当我们完成以上配置之后,接下来就进入到喜闻乐见的导包环节。这个环节基本无坑,只有几点需要注意。

1.关于so文件与BaiduLBS_Android.jar

第一步获取资源时,我们根据选择所需功能获得了百度地图SDK的so文件与jar包,需要注意BaiduLBS_Android.jar这个jar包会包含你选择的功能所有代码(比如你选择了导航,那么导航的代码也包含在这里),不需要像demo(有的版本的Demo是会分包的)中那样集成,避免出现冲突。
加入so文件的时候注意,应该与你项目中的支持so库类型一致,比如项目中只有armeabi与armeabi-v7a文件夹,那么就将百度地图SDK对应的so加入,不需要添加其他类型(如x86等)。如果需要适配所有CPU架构的机器,不得已群全部导入的情况下,就要检查项目中已使用的其他SDK的so是否支持所有的平台,适当地做出取舍。简而言之,各种CPU架构下的文件夹的so应该保持对应一致(不要在armeabi有a.so,而x86下却没有,这种情况我们只保留armeabi就可以了)。这一点在我们使用其他第三方SDK时,也是适用的。

2.项目配置

导入相关文件之后,需要在项目中做出相应配置,就能正常使用百度地图SDK了。这里注意几点:

1、 在application中添加开发密钥

  
      

这个值在创建应用之后就能获得,千万不能出现错误。

2、Android Studio默认放so文件的目录是src\main\jniLibs目录,这个目录需要自己建,如果没有建立也可以放在libs中,只不过需要在app.gradle做如下配置:

sourceSets{
  main{
       jniLibs.srcDir 'libs'  
       //说明so的路径为该libs路径,关联所有地图SDK的so文件
      }
}

3、提前配置混淆文件(怕后面忘记),混淆方法如下:

-keep class com.baidu.** {*;}
-keep class vi.com.** {*;}    
-dontwarn com.baidu.**

3.正式使用中的问题

使用SDK地图时,只要按照文档中编写,基本问题都可以解决。这里记录以下使用中遇到的问题,不定期更新。

1.如何删除指定的单一或者几个Marker

按照文档所述,我们可以轻松地在地图中添加Marker,但是当我想要删除某个Marker时,翻阅文档只找到这个方法

mBaiduMap.clear();
//清除地图上所有覆盖物,无法分成批删除 
百度地图Android SDK使用及注意事项_第5张图片
尼克扬

真的无法成批删除吗?当我查看添加Marker代码时,有了新的发现。添加Marker方法如下:

//定义Maker坐标点  

LatLng point = new LatLng(39.963175, 116.400244);  

//构建Marker图标  

BitmapDescriptor bitmap = BitmapDescriptorFactory  
    .fromResource(R.drawable.icon_marka);  

//构建MarkerOption,用于在地图上添加Marker  

OverlayOptions option = new MarkerOptions()  
    .position(point)  
    .icon(bitmap);  

//在地图上添加Marker,并显示  

mBaiduMap.addOverlay(option);

我发现mBaiduMap.addOverlay(option) 这个方法会返回一个Overlay的对象,而且Overlay类中有一个remove()方法,那么我们就可以实现删除指定marker的功能了,代码如下:

//在地图上添加Marker,并显示,得到返回的overlay对象
Overlay overlay = mBaiduMap.addOverlay(ooA);

//当需要删除这个marker时
overlay.remove();

四、百度定位SDK

1.项目配置

基本按照文档上走不会有问题,只需要注意不要漏掉

 

这个服务以及相关权限。

2.正式使用中的问题

1.Android6.0的动态权限申请

百度定位SDK需要的权限中,有部分在Android6.0以上的系统中需要动态申请:

在Android 6.0系统中,需要动态获取的权限涉及到:

1. 获取手机状态:

Manifest.permission.READ_PHONE_STATE;

2. 获取位置信息:

Manifest.permission.ACCESS_COARSE_LOCATION;
Manifest.permission.ACCESS_FINE_LOCATION;

3. 读写SD卡:

Manifest.permission.READ_EXTERNAL_STORAGE;
Manifest.permission.WRITE_EXTERNAL_STORAGE;

因此我们应该在申请到这些权限之后在做相关的处理。

2.BDLocation.getAddrStr()有时返回null

百度定位SDK,BDLocationListener的onReceiveLocation(BDLocation location)这个回调函数会将定位的相关信息放在BDLocation location中。但是使用过程中发现,调用location.getAddrStr()获取定位点地址时,返回为null,但是定位地点的经纬度是有的。同事教我使用经纬度获取地址(但是会有一定误差,勉强能用),方法如下:

//定位点
BDLocation lastLocation;
GeoCoder geoCoder = GeoCoder.newInstance();
            //
            final OnGetGeoCoderResultListener listener = new OnGetGeoCoderResultListener() {
                // 反地理编码查询结果回调函数
                @Override
                public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
                    if (result == null
                            || result.error != com.baidu.mapapi.search.core.SearchResult.ERRORNO.NO_ERROR) {
                        // 没有检测到结果
                        return;
                    }
                    List poiInfos = result.getPoiList();

                    if (poiInfos != null && poiInfos.size() > 0){
                    //通常取第一条即可
                        PoiInfo info = poiInfos.get(0);
                        TLog.error("Address", info.address);
                    }else {
                        //没检索到结果
                    }

                }

                // 地理编码查询结果回调函数
                @Override
                public void onGetGeoCodeResult(GeoCodeResult result) {
                    if (result == null
                            || result.error != com.baidu.mapapi.search.core.SearchResult.ERRORNO.NO_ERROR) {
                        // 没有检测到结果
                    }
                }
            };
            // 设置地理编码检索监听者
            geoCoder.setOnGetGeoCodeResultListener(listener);
            //
            geoCoder.reverseGeoCode(new ReverseGeoCodeOption()
                    .location(new LatLng(lastLocation.getLatitude(), lastLocation.getLongitude())));

这是获取定位点地址的下策,一般来说回调函数onReceiveLocation(BDLocation location)中的location还是能正常取到值的。

五、百度导航SDK

1.项目配置

1.只有armeabi的so

特别注意,百度导航SDK只提供了armeabi的so文件,而且里面还包括了百度语音功能所需的so。

2.百度语音配置

因为百度导航包含了语音功能,所以要在百度语音中创建应用(我测试时发现现在会默认在百度语音控制台创建,不过没有自动创建的话,手动创建也不是什么难事),之后再代码中设置百度语音的APPID(这个值在百度语音的控制台中查看):

Bundle bundle = new Bundle();
// 必须设置APPID,否则会静音 bundle.putString(BNCommonSettingParam.TTS_APP_ID, "9354030");
BNaviSettingManager.setNaviSdkParam(bundle);

2.正式使用的问题

1.缺少assets资源文件导致黑屏

这是使用百度导航SDK常见坑,有时经常忘记把下载的assets资源文件导入项目中,看似它们是png图片,实际上它们是做了伪装的资源文件,一定得导入,不然导航页面黑屏。


百度地图Android SDK使用及注意事项_第6张图片
assets

就是它们,多少开发者落在它们手中。

2.Android6.0的动态权限申请

老生常谈的问题了,如果没解决好,也可能导致导航页面黑屏。主要需要以下权限:

Manifest.permission.READ_PHONE_STATE;
Manifest.permission.ACCESS_FINE_LOCATION;
Manifest.permission.WRITE_EXTERNAL_STORAGE;

笔者曾经因为少了读写文件权限导致导航页面黑屏,排查了一天bug。

3.算路失败

key配置正确,百度导航引擎初始化成功,但是调用导航却算路失败。
导航时算路失败的原因有以下几种:
(1)地理位置获取失败
(2)传入的经纬度有误(例如经纬度弄反,经纬度标注的点在国外)
(3)定位服务未开启
(4)传入的节点距离太近
(5)节点输入有误(例如设置了某个节点为空)
(6)上次算路取消了,需要等一会才能进行下一次算路

4.在部分8.0机型上,导航页面右下角小图变形问题

这个问题是当我将手机系统升级到8.0时发现的,具体情况如下图:

百度地图Android SDK使用及注意事项_第7张图片
异常图片

我一时找不出原因,只能再看百度的Demo有没有问题,用手机一运行Demo
,果不其然,同样的问题出现了。没办法,只能求助百度了,好在最近百度地图SDK上线了一个问题反馈的功能,之后得到官方的的回答, 解决办法是:替换assets里面两个资源文件(以前我用的是3.3.1版本,现在换成3.3.3)
没错,还是这两个家伙:
百度地图Android SDK使用及注意事项_第8张图片
百度导航资源文件

结语

本文主要总结最经使用百度地图相关SDK遇到的一些问题,不定期更新。

你可能感兴趣的:(百度地图Android SDK使用及注意事项)