百度地图Android SDK是一套应用于Android 4.0及以上版本的地图能力应用程序接口,开发者可以轻松、快捷地在自己的Android应用中集成。目前已经应用于网约车,共享出行,外卖,快递物流等众多行业。
功能包括:地图展示(普通地图、卫星图、路况图、热力图、室内图、个性化地图)与地图交互 (手势交互、控件交互、方法交互) 在地图上绘制(标记点、绘制线、绘制面、绘制Overlay等)检索地图数据(检索POI、公交信息检索、地理编码检索、行政区域检索等)路线规划(步行路线规划、骑行路线规划、驾车路线规划、跨城路线规划、公交路线规划)等功能。
一
Step 1 注册和获取密钥(AK)
用户在使用SDK之前需要获取百度地图移动版开发密钥(AK),该AK与百度账户相关联。 开发者必须先有百度帐户,才能获得AK。并且,该AK与引用SDK的程序包名有关,具体流程请参照申请密钥。请妥善保存AK,地图初始化时需要用到AK。创建好的AK会永久保存在控制台。
获取安全码
申请密钥开发需知:
安全码的组成规则为:Android签名证书的SHA1值+packagena
同一个AK中,可以填写开发版SHA1和发布版SHA1,这样App从开发、测试到发布整个过程中均不需要改动AK。
此功能完全兼容以前的AK,默认将原有的SHA1放在发布版SHA1上,开发者也可自己更新,将原有的开发版本的AK和发布版本的AK对应的SHA1值合并后使用。
调试版本(debug)和发布版本(release)下的SHA1值是不同的,发布apk时需要根据发布apk对应的keystore重新配置Key。
获取SHA1值
获取SHA1因不同的开发工具(Eclipse/Android Studio)不同电脑系统(Windows/Mac)获取的方式也不相同,执行的命令是相同的,在Windows系统下或者Eclipse开发工具下请参考官网的获取方式(点击文章下方阅读原文),以下使用的是mac系统studio开发工具,获取调试版SHA1值为列。
(1) 打开终端工具:输入cd .android,定位到.android文件夹下
(2)调试版本使用 debug.keystore,命令为:keytool -list -v -keystore debug.keystore
发布版本使用apk对应的 keystore,命令为:keytool -list -v -keystore apk的keystore
(3)提示输入密钥库密码,调试版本默认密码是: android,发布模式的密码是为apk的keystore设置的密码。输入密钥后回车(如果没设置密码,可直接回车),此时可在控制台显示的信息中获取SHA1值,如下图所示:
获取包名
Android应用获取包名packagename,根据开发工具不同,获取位置有所不同,Eclipse请参考官网获取方式(点击文章下方阅读原文),以下使用Android Studio获取
开发包名需要在文件build.gradle中查询applicationId,并确保applicationId与在AndroidManifest.xml中定义的包名一致 在文件build.gradle中查询applicationId,方法如图:
注意:使用Android Studio开发,如遇到applicationId与在AndroidManifest.xml中定义的包名不一致的情况,以appclicationid为准。
完成以上步骤点击确定可获取到AK值如图所示:
申请完AK以后接下来就需要在AndroidManifest.xml文件中的application中配置AK如图所示:
android:name="com.baidu.lbsapi.API_KEY" android:value="开发者 key" /> 二 Step 2 下载百度地图SDK 下载地图SDK有两种方式 自定义下载完成后的文件格式 (1) BaiduLAB_Android.jar文件就是包含了所需要的所有功能的jar包。 (2) armeabi等文件夹里就是针对不同手机CPU架构的.so文件。 三 Step 3 Android Studio工程配置 添加jar包 将下载的地图SDK的jar包复制到工程的libs目录下,如图所示 方法一: 工程配置还需要把jar包集成到自己的工程中,如上图所示,放入libs目录下。对于每个jar文件,右键-选择Add As Library,导入到工程中。同时在build.gradle中会生成工程所依赖的对应的jar文件说明,代码如下所示: dependencies{ compile files('libs/BaiduLBS_Android.jar') } 方法二: 1)菜单栏选择 File —>Project Structure。 2)在弹出的Project Structure对话框中, 选择左侧列表module的app, 然后点击Dependencies选项卡。 3)点击绿色的加号选择Jar dependency然后选择要添加的jar包即可完成上边的操作,完成后在APP目录下的build.gradle文件中,会有引入的类库,如上述代码所示。 添加so库 现在Android兼容 5 种CPU架构: armeabi、armeabi-v7a、arm64-v8a、x86、x86_64。开发者可根据实际使用需求,放置所需.so到对应的工程文件夹内。 方法一: 使用默认配置,不需要修改build.gradle,在src/main/目录下新建jniLibs目录,工程会自动加载src目录下的.so动态库,如果已有这个目录,可以直接将.so文件拷贝到对应的架构下,如下图目录结构所示。 方法二: 使用自定义配置,但这样工程并不会自动加载libs下的.so,需说明.so的路径为该libs路径,关联所有地图SDK的.so文件,即在APP文件夹下的bulid.gradle加入代码。 (1) 将下载文件的armeabi文件夹复制到libs目录。 (2) 打开build.gradle,找到sourceSets标签,在里面增加一项配置,如图所示: sourceSets { main { jniLibs.srcDir 'libs' } } 添加所需权限 使用地图SDK之前,需要在AndroidManifest.xml 文件中进行相关权限设置,确保地图功能可以正常使用。 注意: 权限应添加在appliction之外,如添加到appliction内部,会导致无法访问网络,不显示地图。 //获取设备网络状态,禁用后无法获取网络状态 //网络权限,当禁用后,无法进行检索等相关业务 //读取设备硬件信息,统计数据 //读取系统信息,包含系统版本等信息,用作统计 //获取设备的网络状态,鉴权所需网络代理 //允许sd卡写权限,需写入地图数据,禁用后无法显示地图 //获取统计数据 //鉴权所需该权限获取进程列表 //使用步行AR导航,配置Camera权限 配置AK 在AndroidManifest.xml的application中添加开发密钥AK。如果还没有获取AK,请按照Step1流程来获取。 android:name="com.baidu.lbsapi.API_KEY" android:value="开发者 key" /> 四 Step 4 Hello BaiduMap 显示基础地图 百度地图SDK支持两种地图组件分别是MapView和TextureMapView,是Android View类的子类,MapView和TextureMapView都是地图容器。用这两种加载地图的方法与Android提供的其他View 一样,用于在Android View中放置地图。两个地图组件的使用方法是一样的,具体的使用步骤如下: 在布局xml文件中添加地图控件; android:id="@+id/bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /> 在应用程序创建时初始化SDK引用的Context全局变量; 注意:地图的各个组件功能依赖与SDK的正确初始化,并且为了保证整个APP的生命周期里地图SDK都存活、功能可用,我们建议该方法在APP的Applcaition派生类的onCreate方法中调用。 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各组件之前初始化context信息,传入ApplicationContext //注意该方法要再setContentView方法之前实现 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); } } 创建地图Activity,管理地图生命周期; public class MainActivity extends Activity { private MapView mMapView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各组件之前初始化context信息,传入ApplicationContext //注意该方法要再setContentView方法之前实现 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); //获取地图控件引用 mMapView = (MapView) findViewById(R.id.bmapView); } @Override protected void onDestroy() { super.onDestroy(); //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 mMapView.onPause(); } } ` 注:自v4.5.2起,mapview已经可以完美替代textureMapview,且性能更好。textureMapview当前版本仍会保留,但不建议使用。 如果使用TextureView渲染(使用前提:Android 4.0以上系统,并开启强制GPU渲染)。 完成以上步骤就可以在你的APP中显示出地图。 ---------常见错误--------- 鉴权错误码230:我们对Mobile类型(Android/IOS)的服务请求进行了安全码校验;所谓安全码即开发者在API控制台申请AK(AK和APP一一对应)时提供的APP签名的SHA1+”;”+包名;请求服务必须要携带该安全码作为参数,不携带或者携带不一致的安全码给服务端,均会返回230错误。当出现230错误时。解决办法:请开发者先查看一下APP当前签名的SHA1值(注意不是MD5)和包名,然后去API控制台把查看该AK对应配置的安全码是否和APP实际的一致,如果不一致请去API控制台手动修改一致即可。 错误码-11:如果遇到错误码是errorcode: -11 uid: -1 appid -1 msg: httpsPost failed; 这种情况下是由系统的时间不是当前时间造成的,解决办法:把时间修改成自动获取时间和日期,也就是使用网络提供的时间。 错误码-10:如果遇到错误码是errorcode: -10 uid: -1 appid -1 msg: Current network is not available;(1)这种情况下一般都是由网络原因造成的鉴权失败,解决办法:检查网络是不是正常。(2)网络正常,还是出现这种情况,请打开浏览器排查下能不能正常访问https请求的地址,如不能正常访问则说明您的https安全证书到期,需要网站所有者到https安全证书签发机构CA续签证书。 错误码-1:如果遇到错误码是errorcode: -1 uid: -1 appid -1 msg: Exception:java.security.cert.CertPathValidatorException: Trust anchor for certification path not found;这种情况下是由https证书过期造成的,解决办法:请打开浏览器排查下能不能正常访问https请求的地址,如不能正常访问则说明您的https安全证书到期,需要网站所有者到https安全证书签发机构CA续签证书。 错误码-200:如果遇到错误码是errorcode: 200 uid: -1 appid -1 msg: APP不存在;这种情况一般都是AndroidManifest.xml文件中key没有填写正确。解决办法:请仔细核对AndroidManifest.xml的key和控制台的key是否一致,检查AndroidManifest.xml中填写key时是否有空格存在。 错误:NativeLoader: found libBaiduMapSDK_map_v5_1_0.so error 这种情况是因为缺少.so文件。解决办法:请按照官网开发引导去配置,也可以参考官网中的demo进行配置。 错误:NativeLoader: loadException; NativeLoader: BaiduMapSDK_base_v5_1_0 Failed to load. 这种情况是so库加载失败,禁止不同架构下的.so文件串用。解决办法:请保证.so文件是在对应的架构文件夹下。