开发者教程之地图SDK系列丨第二期:《集成Andriod百度地图SDK》

百度地图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文件是在对应的架构文件夹下。

 

收藏 评论(3)
分享到:
共3条回复 最后由此生不渝的鱼 回复于2019-11-16 11:28