开发者教程之地图SDK系列丨第二期:《集成Andriod百度地图SDK》
2020.02.28 05:40浏览量:12469简介:百度地图Android SDK是一套应用于Android 4.0及以上版本的地图能力应用程序接口,开发者可以轻松、快捷地在自己的Android应用中集成。目前已
百度地图Android SDK是一套应用于Android 4.0及以上版本的地图能力应用程序接口,开发者可以轻松、快捷地在自己的Android应用中集成。目前已经应用于网约车,共享出行,外卖,快递物流等众多行业。
一功能包括:地图展示(普通地图、卫星图、路况图、热力图、室内图、个性化地图)与地图交互 (手势交互、控件交互、方法交互) 在地图上绘制(标记点、绘制线、绘制面、绘制Overlay等)检索地图数据(检索POI、公交信息检索、地理编码检索、行政区域检索等)路线规划(步行路线规划、骑行路线规划、驾车路线规划、跨城路线规划、公交路线规划)等功能。
Step 1 注册和获取密钥(AK)
用户在使用SDK之前需要获取百度地图移动版开发密钥(AK),该AK与百度账户相关联。 开发者必须先有百度帐户,才能获得AK。并且,该AK与引用SDK的程序包名有关,具体流程请参照申请密钥。请妥善保存AK,地图初始化时需要用到AK。创建好的AK会永久保存在控制台。
注册账号
- 点击控制台创建一个应用
-
填写应用名称、应用类型注意选择“Android SDK”,正确填写安全码,点击确认,系统将会自动帮您生成相应的开发密钥:
获取安全码
申请密钥开发需知:
-
安全码的组成规则为: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如图所示:
<application>
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="开发者 key" />
</application>
二
Step 2 下载百度地图SDK
下载地图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文件说明,代码如下所示:
方法二:
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内部,会导致无法访问网络,不显示地图。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 这个权限用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
//获取设备网络状态,禁用后无法获取网络状态
<uses-permission android:name="android.permission.INTERNET"/>
//网络权限,当禁用后,无法进行检索等相关业务
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
//读取设备硬件信息,统计数据
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
//读取系统信息,包含系统版本等信息,用作统计
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
//获取设备的网络状态,鉴权所需网络代理
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
//允许sd卡写权限,需写入地图数据,禁用后无法显示地图
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
//获取统计数据
<uses-permission android:name="android.permission.GET_TASKS" />
//鉴权所需该权限获取进程列表
<uses-permission android:name="android.permission.CAMERA" />
//使用步行AR导航,配置Camera权限
配置AK
-
在AndroidManifest.xml的application中添加开发密钥AK。如果还没有获取AK,请按照Step1流程来获取。
<application>
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="开发者 key" />
</application>
四
Step 4 Hello BaiduMap
显示基础地图
百度地图SDK支持两种地图组件分别是MapView和TextureMapView,是Android View类的子类,MapView和TextureMapView都是地图容器。用这两种加载地图的方法与Android提供的其他View 一样,用于在Android View中放置地图。两个地图组件的使用方法是一样的,具体的使用步骤如下:
-
在布局xml文件中添加地图控件;
<com.baidu.mapapi.map.MapView
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文件是在对应的架构文件夹下。
发表评论
登录后可评论,请前往 登录 或 注册