1.写在前面
项目中需要加上路线规划,导航,添加覆盖物,因为我最开始项目中定位我使用的是百度定位,所以为了省事,接着使用百度地图sdk实现这些。这两天踩了很多百度地图的坑,记下来。因为一些原因,后面会说,需求还没做完,所以效果图很简单,如下。
2.坑1,环境配置
对于百度地图sdk的配置我是无语。因为一开始项目中并没打算使用百度地图其他功能,只是准备定位。所以我下载sdk时只是下载了定位的sdk,如图
现在需要加上地图和导航的sdk(后面才知道导航并不需要下载专门的导航sdk,因为地图sdk可以直接调用百度地图客户端或者网页), 所以我一键自定义时,把他们全下载了(包括定位),如图,因为不管什么功能的sdk中jar包的命名是一样的,都是BaiduLBS_Android.jar,所以我如果只下载地图和导航,里面的jar也是这个名字,这是不行的。
全部下载后,得到的lib是这样的,如图。
发现没,这libs里面的只有一个架构armeabi,这里我就有种不好的预感,因为这里面并没有想定位下载下来的一样,分为很多架构,如图
然后将权限,依赖什么的都配置好,因为前面用了定位,所以key已经好了。一运行,发现刚进app定位一直失败,看了下定位失败的错误码报162,一查发现162:请求串密文解析失败,一般是由于客户端SO文件加载失败造成,请严格参照开发指南或demo开发,放入对应SO文件。
果然 ,然后我为了验证把libs全部删了把前面只有定位的lib试了下,发现定位可以。试了很多办法和搜了很多资料,最后没办法我用了很直白的方法解决了。
解决坑1 我发现单独下载地图或者定位里面的libs都很正常,如图
只有单独下载导航的libs不正常,如图
所以我有准备使用三个功能地图,定位,导航的的jar包,和分别下载三个功能的so文件,手动把他们分到一起去,
最后确实成功了,运行后可以定位,而且三个功能的api都可以使用,但是后面发现调用外部地图其实并不需要导航的sdk,所以这上面操作然并卵,但是如果有人需要使用导航的sdk,那这种思路是可以的。
3.百度地图地理编码
因为后面路线规划时需要终点的位置,我觉得使用经纬度比文字描述好点,所以准备将终点位置转成经纬度,这个比较容易,只要知道得出来的百度坐标系。代码如下
实现OnGetGeoCoderResultListener接口,
GeoCoder mSearch = null;
// 初始化搜索模块,注册事件监听
mSearch = GeoCoder.newInstance();
mSearch.setOnGetGeoCodeResultListener(this);
mSearch.geocode(new GeoCodeOption()
.city(address)
.address(address));
这里我发现一个有意思的事,api中GeoCodeOption的参数是设置城市和设置地址,但是其实可以写一个参数,如上面.
前面实现了接口,需要重写的两个方法就是返回的结果,代码如下
//获取正向编码规则
@Override
public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
//没有检索到结果
Toast