Android定位功能开发(2)——用百度地图API显示地图

要将位置数据以地图的形式显示,需要使用第三方的地图服务。常用的地图服务有谷歌地图、百度地图、高德地图等。这里我们以百度地图为例进行介绍。

百度地图服务的网站是:https://lbsyun.baidu.com/。百度地图提供的服务包括:

  • 定位服务:获取经纬度
  • 地图服务:地图显示等
  • 数据服务:地理编码等
  • 出行服务:公交线路等
  • 轨迹服务:轨迹追踪等
  • 分析服务:交通拥堵等

使用百度地图服务需要以下步骤:

  1. 注册百度开发者帐号
  2. 申请使用百度地图服务的密钥,即AK(API Key)
  3. 下载百度地图SDK
  4. 在项目中引入需要的jar包和.so文件,jar文件为Java类库,.so文件为Linux下用户层动态库,即类库中一些Java方法的C++实现
  5. 调用百度地图API

详细说明如下:

第一步,访问百度开发者中心首页:https://developer.baidu.com/,注册百度开发者帐号。

第二步,设置密钥。设置密钥是为了验证地图服务使用者的身份。百度限制每个使用者每天免费使用地图服务的次数。访问百度地图服务首页https://lbsyun.baidu.com/,按照要求注册并领取秘钥。

申请密钥需要创建一个应用,应用类型选Android SDK,并填写必要的信息,以便调用地图服务时验证身份。其中发布版SHA1为开发者所用数字签名的指纹,可从keystore文件获得。开发版SHA1为AndroidStudio所用的数字签名的指纹,可从开发工具查看。包名为应用的包名,通过SHA1+包名可以验证开发者身份。

AndroidStudio开发版SHA1保存在秘钥文件debug.keystore中,用keytool.exe能够查看。具体方法是:打开命令行窗口,切换到C:\Users\(当前用户)\.android\目录,秘钥文件debug.keystore文件就保存在这个目录中。运行keytool命令:

keytool –list –v –keystore debug.keystore

开发版数字签名文件的密码为空或者"Android",为空的话需要输入秘钥时直接回车即可。

发布版SHA1需要使用keytool命令从发布时用的数字签名keystore文件获得,注意保密!命令是:

keytool –list –v –keystore

发布版数字签名文件的密码为开发者创建数字签名时设置的密码。

应用创建成功后,得到一个AK(API Key)。API Key需要填入项目配置文件中,和数字签名、包名一起验证开发者身份。

第三步,需要下载百度地图SDK。从百度地图开放平台首页菜单栏选择:开发文档-Android地图SDK(https://lbsyun.baidu.com/index.php?title=androidsdk/sdkandev-download)

选“自定义下载”,进入下载定制页面,选中“基础地图”、“检索”、“JAR”,“标准开发包”,然后点击最下面的“开发包”按钮。

百度地图SDK(V7.5.2)下载下来为一个zip文件,解压后为一个libs目录,其中的文件为开发用的jar包和so文件。如果需要示例代码和类文档,可以点另外两个按钮下载。

第四步,创建项目并引入需要的jar包和.so文件。下面我们编写一个例子,将百度地图显示在界面上。

在AndroidStudio项目中引入需要的jar包和.so文件。具体方法是:

  1. 在工程app/libs目录下放入百度地图的jar包
  2. 在src/main目录下新建jniLibs目录,将包含.so文件的五个目录复制到jniLibs下
  3. 在jar文件上点右键,选“add as library”

注意jar和so的版本号必须一致,必须使用同一个压缩包中的文件。

在项目中使用百度地图API还需要:在配置文件中添加权限、API Key。代码如下:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<application ……>
      <meta-data  
             android:name="com.baidu.lbsapi.API_KEY"  
             android:value="sh7W0c2SOQkTnk0eQnLq9E5cEciMxLm2" /> 
      <activity
……
      </activity>
</application>

在界面布局中添加百度MapView控件,代码如下:

<com.baidu.mapapi.map.MapView  
       android:id="@+id/bmapView"  
       android:layout_width="fill_parent"  
       android:layout_height="fill_parent"  
       android:clickable="true" />

百度MapView的生命周期需要根据Activity的生命周期来管理,用Java代码控制地图的生命周期和操作。具体包括:

  • 在Activity的onCreate中初始化,注意:SDK初始化必须在MapView初始化之前,所以在setContentView之前
  • 在Activity的onDestroy中销毁
  • 在Activity的onPause中暂停
  • 在Activity的onResume中恢复

代码如下:

public class MainActivity extends Activity {
      MapView mMapView;
      protected void onCreate(Bundle savedInstanceState){
	        super.onCreate(savedInstanceState);
         SDKInitializer.setAgreePrivacy(getApplicationContext(), true);
	        SDKInitializer.initialize(getApplicationContext());
	        setContentView(R.layout.main_layout);
	        mMapView = (MapView)findViewById(R.id.bmapView);
      }

      protected void onDestroy(){
	        super.onDestroy();
	        mMapView.onDestroy();
      }

      protected void onPause(){
	        super.onPause();
	        mMapView.onPause();
      }

      protected void onResume(){
	        super.onResume();
	        mMapView.onResume();
      }
}

 

至此,运行项目即可将百度地图显示在手机上,运行时需访问互联网。在模拟器上运行时可能会有"eglChooseConfig failed"异常,原因是百度地图绘制时需要OpenGL3.0,而模拟器只支持2.0。所以最好在真机上运行百度地图的例子。

猜你喜欢

转载自blog.csdn.net/nanoage/article/details/128248711