APP下载

基于Android SDK离线地图功能的实现

2014-07-28张国海

电脑知识与技术 2014年18期
关键词:手机

摘要:针对手机地图功能进行分析,为了带来更好的地图体验并节省流量,在借鉴百度地图 Android SDK的基础上,实现了一款实用方便的手机离线地图。

关键词:手机;百度地图Android SDK;离线地图

中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2014)18-4172-03

Realization of Offline Map based on Android SDK

ZHANG Guo-hai

(Guangzhou Civil Aviation College, Guangzhou 510403, China)

Abstract: In order to bring better experience and save flow, based on Baidu map android SDK and the analysis of the function of mobile phone map, implemented a practical and convenient offline mobile map.

Key words: Mobile; Baidu map android SDK; offline map

随着移动网络时代发展步伐的不断加快,市面上如街景地图、高德导航和百度地图等基于位置服务(LBS:Location Based Service)软件给人们生活带来了实质性的变化。人们出行不再像以前依赖纸质地图和指南针,只需在手机屏幕上轻松点击,便可以轻松实现自主导航[1]。该文中实现的离线地图功能是基于百度地图 Android SDK开发而成,百度地图 Android SDK是一套基于Android 2.1及以上版本设备的应用程序接口。 您可以使用该套 SDK开发适用于Android系统移动设备的地图应用,通过调用地图SDK接口,您可以轻松访问百度地图服务和数据, 构建功能丰富、交互性强的地图类应用程序[2]。

1 工程配置

百度地图Android SDK提供的所有服务是免费的,接口使用无次数限制。只有申请密钥(key)后,才可使用百度地图Android SDK。开发者可以在http://developer.baidu.com/map/sdkandev-14.htm申请密钥。开发离线地图,申请密钥后,还要下载jar包和离线地图。该文所使用的是baidumapapi_v2_4_1.jar包。

1.1 jar包导入到项目

Jar包下载后,要进行如下操作才可使用:

1)在工程里新建libs文件夹(若不存在的话),将开发包里的baidumapapi_v2_1_1.jar拷贝到libs根目录下,将libapp_BaiduMapApplib_v2_1_1.so拷贝到libs\armeabi目录下。如图1所示。

图1 libs目录结构

2)项目属性中Java Build Path→Order and Export中,确定Android Private Libaries与Android Dependencies这两项前面的选择框被选上后,确定。

3)菜单Project→clean重新编译项目后就可以正常使用地图中的功能进行编程了。

1.2 离线地图导入SD卡

下载的离线包解压后,把其中的vmp文件夹拷入SD卡根目录下的BaiduMapSdk文件夹内。

2 离线地图功能的实现

首先在Manifest中添加使用权限、Android版本及屏幕支持和对应的开发密钥,具体代码可参考http://developer.baidu.com/map/sdkandev-2.htm。该文开发的离线地图有两个界面,一个主界面,用于显示下载的离线城市地图,另一个用于显示离线城市地图,可显示普通地图、卫星图和实时交通图。

2.1 离线地图开发使用的主要类

1)MapView 显示地图的视图,当被焦点选中时,它能捕获按键事件和触摸手势去平移和缩放地图。MapView的创建可以使用在XML布局的方式创建,也可以使用构建函数创建。MapView的生命周期需要与Activity同步,即需要在Activity.onPause中调用onPause(), 在Activity.onResume中调用onResume(),在Activity.onDestroy中调用 destroy()。

2)MapController,地图控制器,MapController的方法主要是对地图的放大缩小,俯视旋转,手势键盘处理,指南针位置,动画等。主要方法有setCenter,函数原型

public void setCenter(GeoPoint point)功能是在给定的中心点GeoPoint上设置地图视图。

方法setZoom,函数原型public float setZoom(float zoomLevel)功能是设置地图的缩放级别。这个值的取值范围是[3,19]。

3)BmapManager 地图引擎管理类,BmapManager具有Application级别的生命周期,BMapManager应在sdk功能模块使用前初始化, 并且在sdk功能模块销毁后销毁。

4)MKOfflineMap 实现离线地图服务,用于离线地图的管理。主要方法有:

Init,函数原型public boolean init(MapController mapCtr, MKOfflineMapListener listener)

初使化MKOfflineMap ,mapCtr参数为初始化离线地图模块所需要的MapController对象。

scan,函数原型public int scan(boolean bDeleteFailed)作用是导入离线地图包。

getAllUpdateInfo,函数原型

public java.util.ArrayList getAllUpdateInfo()作用是返回各城市离线地图更新信息。

getUpdateInfo,函数原型public MKOLUpdateElement getUpdateInfo(int cityID)返回指定城市ID离线地图更新信息。

remove,函数原型public boolean remove(int cityID)删除指定城市ID的离线地图。

2.2 application类

因为地图引擎管理类BmapManager具有Application级别的生命周期,BMapManager应在sdk功能模块使用前初始化, 并且在sdk功能模块销毁后销毁,因此要构造一个继承application类来实现对BmapManager管理。BmapManager初始化放在继承application类中实现。

2.3 界面设计

界面分为主界面和离线地图显示界面。主界面如图2所示:

图2 主界面 图3 地图显示界面

图2中,“已下载城市地图”TextView控件下面为一个ListView控件,用于显示已经下载的城市地图列表。图3中“普通图”、“卫星图”和“交通图”用于切换显示不同的地图,下面MapView控件用于显示选择的地图。

2.4 离线地图功能实现

2.4.1离线地图的显示

离线地图的显示在一个继承自Activity类中实现。首先在类中实例化两个对象MapView,MapController,用于地图的控制和显示。然后在OnCreate函数中对这两个对象进行初始化。

初始化离线地图的核心代码如下:

myapplication app = (myapplication)this.getApplication();

if (app.mBMapManager == null) {

app.mBMapManager = new BMapManager(getApplicationContext());

// 如果BMapManager没有初始化则初始化BMapManager

app.mBMapManager.init(new myapplication.MyGeneralListener());

}

setContentView(R.layout.display_map);

mMapView = (MapView)findViewById(R.id.bmapView);

mMapController = mMapView.getController();

// 设置地图缩放级别

mMapView.setBuiltInZoomControls(true);

mMapController.setZoom(12);

GeoPoint p ;

double cLat = 39.945 ;

double cLon = 116.404 ;

Intent intent = getIntent();

if ( intent.hasExtra("x") && intent.hasExtra("y") ){

Bundle b = intent.getExtras();

p = new GeoPoint(b.getInt("y"), b.getInt("x"));

}else{

p = new GeoPoint((int)(cLat * 1E6), (int)(cLon * 1E6));

}

mMapController.setCenter(p);

并重写onDestroy(),onPause()和onResume()方法。onResume()方法如下:

protected void onResume(){

mMapView.onResume();

myapplication app = (myapplication)this.getApplication();

if(app.mBMapManager!=null){

app.mBMapManager.start();

}

super.onResume();

}

2.4.2显示模式的切换

显示模式的切换可在“普通图”、“卫星图”和“交通图”这三个按钮控件的消息响应函数中处理。是否打开路况图可调用MapView类中的成员函数setTraffic(boolean on)来设置,是否打开卫星图可调用MapView类中的成员函数setSatellite(boolean on)来设置。程序在真机上运行效果如图4和图5所示。

图4 卫星图 图5 普通图

3 结束语

本文利用了Android手机平台和百度地图Android SDK,完成了离线地图功能的实现。程序在Android Developer Tools v22.3.0平台上,利用真机进行了测试,效果良好。

参考文献:

[1] 李瑞宣,王山东,徐志远,等. 基于Android平台定位系统设计和实现[J]. 信息技术,2013(12):187-190.

[2]百度地图Android SDK开发指南[EB/OL]. http://developer.baidu.com/map/sdk-android.htm.

Init,函数原型public boolean init(MapController mapCtr, MKOfflineMapListener listener)

初使化MKOfflineMap ,mapCtr参数为初始化离线地图模块所需要的MapController对象。

scan,函数原型public int scan(boolean bDeleteFailed)作用是导入离线地图包。

getAllUpdateInfo,函数原型

public java.util.ArrayList getAllUpdateInfo()作用是返回各城市离线地图更新信息。

getUpdateInfo,函数原型public MKOLUpdateElement getUpdateInfo(int cityID)返回指定城市ID离线地图更新信息。

remove,函数原型public boolean remove(int cityID)删除指定城市ID的离线地图。

2.2 application类

因为地图引擎管理类BmapManager具有Application级别的生命周期,BMapManager应在sdk功能模块使用前初始化, 并且在sdk功能模块销毁后销毁,因此要构造一个继承application类来实现对BmapManager管理。BmapManager初始化放在继承application类中实现。

2.3 界面设计

界面分为主界面和离线地图显示界面。主界面如图2所示:

图2 主界面 图3 地图显示界面

图2中,“已下载城市地图”TextView控件下面为一个ListView控件,用于显示已经下载的城市地图列表。图3中“普通图”、“卫星图”和“交通图”用于切换显示不同的地图,下面MapView控件用于显示选择的地图。

2.4 离线地图功能实现

2.4.1离线地图的显示

离线地图的显示在一个继承自Activity类中实现。首先在类中实例化两个对象MapView,MapController,用于地图的控制和显示。然后在OnCreate函数中对这两个对象进行初始化。

初始化离线地图的核心代码如下:

myapplication app = (myapplication)this.getApplication();

if (app.mBMapManager == null) {

app.mBMapManager = new BMapManager(getApplicationContext());

// 如果BMapManager没有初始化则初始化BMapManager

app.mBMapManager.init(new myapplication.MyGeneralListener());

}

setContentView(R.layout.display_map);

mMapView = (MapView)findViewById(R.id.bmapView);

mMapController = mMapView.getController();

// 设置地图缩放级别

mMapView.setBuiltInZoomControls(true);

mMapController.setZoom(12);

GeoPoint p ;

double cLat = 39.945 ;

double cLon = 116.404 ;

Intent intent = getIntent();

if ( intent.hasExtra("x") && intent.hasExtra("y") ){

Bundle b = intent.getExtras();

p = new GeoPoint(b.getInt("y"), b.getInt("x"));

}else{

p = new GeoPoint((int)(cLat * 1E6), (int)(cLon * 1E6));

}

mMapController.setCenter(p);

并重写onDestroy(),onPause()和onResume()方法。onResume()方法如下:

protected void onResume(){

mMapView.onResume();

myapplication app = (myapplication)this.getApplication();

if(app.mBMapManager!=null){

app.mBMapManager.start();

}

super.onResume();

}

2.4.2显示模式的切换

显示模式的切换可在“普通图”、“卫星图”和“交通图”这三个按钮控件的消息响应函数中处理。是否打开路况图可调用MapView类中的成员函数setTraffic(boolean on)来设置,是否打开卫星图可调用MapView类中的成员函数setSatellite(boolean on)来设置。程序在真机上运行效果如图4和图5所示。

图4 卫星图 图5 普通图

3 结束语

本文利用了Android手机平台和百度地图Android SDK,完成了离线地图功能的实现。程序在Android Developer Tools v22.3.0平台上,利用真机进行了测试,效果良好。

参考文献:

[1] 李瑞宣,王山东,徐志远,等. 基于Android平台定位系统设计和实现[J]. 信息技术,2013(12):187-190.

[2]百度地图Android SDK开发指南[EB/OL]. http://developer.baidu.com/map/sdk-android.htm.

Init,函数原型public boolean init(MapController mapCtr, MKOfflineMapListener listener)

初使化MKOfflineMap ,mapCtr参数为初始化离线地图模块所需要的MapController对象。

scan,函数原型public int scan(boolean bDeleteFailed)作用是导入离线地图包。

getAllUpdateInfo,函数原型

public java.util.ArrayList getAllUpdateInfo()作用是返回各城市离线地图更新信息。

getUpdateInfo,函数原型public MKOLUpdateElement getUpdateInfo(int cityID)返回指定城市ID离线地图更新信息。

remove,函数原型public boolean remove(int cityID)删除指定城市ID的离线地图。

2.2 application类

因为地图引擎管理类BmapManager具有Application级别的生命周期,BMapManager应在sdk功能模块使用前初始化, 并且在sdk功能模块销毁后销毁,因此要构造一个继承application类来实现对BmapManager管理。BmapManager初始化放在继承application类中实现。

2.3 界面设计

界面分为主界面和离线地图显示界面。主界面如图2所示:

图2 主界面 图3 地图显示界面

图2中,“已下载城市地图”TextView控件下面为一个ListView控件,用于显示已经下载的城市地图列表。图3中“普通图”、“卫星图”和“交通图”用于切换显示不同的地图,下面MapView控件用于显示选择的地图。

2.4 离线地图功能实现

2.4.1离线地图的显示

离线地图的显示在一个继承自Activity类中实现。首先在类中实例化两个对象MapView,MapController,用于地图的控制和显示。然后在OnCreate函数中对这两个对象进行初始化。

初始化离线地图的核心代码如下:

myapplication app = (myapplication)this.getApplication();

if (app.mBMapManager == null) {

app.mBMapManager = new BMapManager(getApplicationContext());

// 如果BMapManager没有初始化则初始化BMapManager

app.mBMapManager.init(new myapplication.MyGeneralListener());

}

setContentView(R.layout.display_map);

mMapView = (MapView)findViewById(R.id.bmapView);

mMapController = mMapView.getController();

// 设置地图缩放级别

mMapView.setBuiltInZoomControls(true);

mMapController.setZoom(12);

GeoPoint p ;

double cLat = 39.945 ;

double cLon = 116.404 ;

Intent intent = getIntent();

if ( intent.hasExtra("x") && intent.hasExtra("y") ){

Bundle b = intent.getExtras();

p = new GeoPoint(b.getInt("y"), b.getInt("x"));

}else{

p = new GeoPoint((int)(cLat * 1E6), (int)(cLon * 1E6));

}

mMapController.setCenter(p);

并重写onDestroy(),onPause()和onResume()方法。onResume()方法如下:

protected void onResume(){

mMapView.onResume();

myapplication app = (myapplication)this.getApplication();

if(app.mBMapManager!=null){

app.mBMapManager.start();

}

super.onResume();

}

2.4.2显示模式的切换

显示模式的切换可在“普通图”、“卫星图”和“交通图”这三个按钮控件的消息响应函数中处理。是否打开路况图可调用MapView类中的成员函数setTraffic(boolean on)来设置,是否打开卫星图可调用MapView类中的成员函数setSatellite(boolean on)来设置。程序在真机上运行效果如图4和图5所示。

图4 卫星图 图5 普通图

3 结束语

本文利用了Android手机平台和百度地图Android SDK,完成了离线地图功能的实现。程序在Android Developer Tools v22.3.0平台上,利用真机进行了测试,效果良好。

参考文献:

[1] 李瑞宣,王山东,徐志远,等. 基于Android平台定位系统设计和实现[J]. 信息技术,2013(12):187-190.

[2]百度地图Android SDK开发指南[EB/OL]. http://developer.baidu.com/map/sdk-android.htm.

猜你喜欢

手机
利用数码相机或手机自主开发物理教学资源的研究
手机锂离子电池充电电路的设计与实现