要将位置数据以地图的形式显示,需要使用第三方的地图服务。常用的地图服务有谷歌地图、百度地图、高德地图等。这里我们以百度地图为例进行介绍。
百度地图服务的网站是:https://lbsyun.baidu.com/。百度地图提供的服务包括:
- 定位服务:获取经纬度
- 地图服务:地图显示等
- 数据服务:地理编码等
- 出行服务:公交线路等
- 轨迹服务:轨迹追踪等
- 分析服务:交通拥堵等
使用百度地图服务需要以下步骤:
- 注册百度开发者帐号
- 申请使用百度地图服务的密钥,即AK(API Key)
- 下载百度地图SDK
- 在项目中引入需要的jar包和.so文件,jar文件为Java类库,.so文件为Linux下用户层动态库,即类库中一些Java方法的C++实现
- 调用百度地图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文件。具体方法是:
- 在工程app/libs目录下放入百度地图的jar包
- 在src/main目录下新建jniLibs目录,将包含.so文件的五个目录复制到jniLibs下
- 在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。所以最好在真机上运行百度地图的例子。