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

前言

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

一、百度地图SDK相关资源

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

百度地图SDK下载页面

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

二、创建应用

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

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

页面如下:


创建应用

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

2.配置包名及SHA1值

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

这里写图片描述

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

<application>  
    <meta-data  
        android:name="com.baidu.lbsapi.API_KEY"  
        android:value="开发者 key" />  
</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();
//清除地图上所有覆盖物,无法分成批删除 
尼克扬

真的无法成批删除吗?当我查看添加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.项目配置

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

<service 
android:name="com.baidu.location.f" 
android:enabled="true" android:process=":remote"> 
</service>

这个服务以及相关权限。

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<PoiInfo> 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图片,实际上它们是做了伪装的资源文件,一定得导入,不然导航页面黑屏。


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时发现的,具体情况如下图:

异常图片

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

结语

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容