APP下载

基于android的旅行软件的设计与实现

2018-01-20贺惠萍荣彦康浩张兰

电脑知识与技术 2018年31期

贺惠萍 荣彦 康浩 张兰

摘要:Android是一种以Linux为基础的开源代码操作系统,主要应用于智能手机、平板电脑等移动设备,因其良好的人机交互能力和能够安装使用众多功能各异的应用软件而深受人们喜爱。根据当下人们的使用习惯和实际需求,设计并实现了拥有定位、路线规划、拍照摄影、天气预报查询、微博分享等功能的综合型旅行软件。测试结果表明,该软件能方便人们的出游,给人们提供快捷的出行工具。

关键词:Android;旅行软件;路线规划;微博分享

中图分类号:TP393   文献标志码:A     文章编号:1009-3044(2018)31-0067-04

Design and Implementation of a Travel Software Based on Android

HE Hui-ping, RONG Yan, KANG Hao, ZHANG Lan

(School of mechanics and Engineering Science, Zhengzhou University, Zhengzhou 450001, China)

Abstract: Android is an open source code operating system based on Linux. It is mainly used in smart phone. It is very popular because of its good human-machine interaction ability and the ability to install and use many different applications with different functions. A travel software  was designed and implemented with the functions of positioning, route planning, photo photography, weather forecast inquiries and micro-blog sharing, according to people's use and practical needs. The test results show that the software can facilitate people's outbound travel and provide quick travel tools for people.

Key words: Android; travel software; route planning; micro-blog share

1 背景

Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,因其良好的人机交互能力和能够安装使用众多功能各异的应用软件而深受人们喜爱。随着技术的发展,智能手机已经可以实现很多各式各样的功能。以前需要依赖专业仪器才能实现的功能,比如摄像拍照,手机已经可以轻松实现。动辄300-500万像素,高则上千万像素的摄像头,不但能拍摄效果不错的照片,甚至可以拍摄高清视频,在很多时候,都不需要特别带相机出门,一部手机足以。智能手机大多都配有GPS芯片,再装上灵图天行者,凯立德等GPS软件,既能导航定位,又能记录行踪,畅游天下也不怕[1-2]。

虽然目前很多手机已经可以实现各式各样的功能,但还没有一款实用型强的综合型旅行软件。为了给旅友提供方便快捷的出行工具,该文提出了基于Android的旅行软件,可以帮助人们很好地管理旅游途中的各种信息。该软件拥有定位、路线规划、休闲娱乐查询、拍照、摄影、小助手、个人中心、天气预报等功能。可以帮助把出行的路线记录下来,并且还能把在各个景点拍的照片,标记在上面。这样,不但能看到当时的照片,更能体验当时的情形,还能给每段旅程或每个地方配上小小的游记心得。而且可以查询旅游景点的天气来制定出游计划,快捷方便。还可以方便地与别人分享、查找信息。可以很大程度的减少喜欢旅游的朋友们的工作量,提高出行效率[3-4]。

2 Android的架构概述

Android是一个包括操作系统,中间件以及一些重要应用程序的专门针对移动设备的层次结构的软件集[5-6]。其软件层次结构自下而上分为以下几个层次:

第一层:Linux操作系统和驱动(Linux kernel),由C语言实现。包括Android核心系统服务所依赖的Linux2.6内核,以及内核的驱动程序。

第二层:本地框架和Java运行环境(LIBRARIES 和 ANDROID RUNTIME)由C/C++实现。包含C/C++库,被Android系统中不同組件使用,它们通过Android应用程序框架为开发者进行服务。

第三层:Android应用框架(ANDROIDFRAMEWORK)。在Android系统中,开发人员也可以完全访问核心应用程序所使用的API框架。

第四层:Android应用程序(APPLICATIONS)。Android应用程序都是有Java语言编写的。用户开发的Android应用程序和Android的核心应用程序是同一层次的,它们都是基于Android的系统API构建的。

3 系统设计与实现

旅行软件总的分为五个功能模块,每个模块下有相应的子功能。五个功能模块分别为地图、相机、天气预报、个人中心和小助手。相机提供了拍照、摄影功能;地图提供了公交、休闲娱乐等信息查询,天气预报提供天气的查询,根据这些查询结果旅友可以准备出行装备;个人中心可以使旅友进行微博分享和记录日记;小助手则提供了文字手册提供给旅友参考。项目功能结构图如图1:

3.1 地图模块

在地图模块下有四个子功能模块如图1所示,任何用户在打开地图的时候,可以进行定位、路线查询、餐饮娱乐休闲信息查询。

3.1.1 定位

定位模块能快速定位用户的当前位置,它由LocationOverlayDemo.java类提供,并继承MapViewactivity。因为是对百度地图操作,其实质是重写它原有的Activity。使用百度地图SDK前需先初始化地图管理者。地图管理者是一个BMapManager类,地图定位、搜索功能都需要BMapManager来管理[7]。BMapManager提供四个接口:init, start, stop, destroy。在Application里生成BMapManager对象并初始化,在程序退出时调用destory,在需要使用sdk功能的activity的onCreate里调用start, onDestroy调用stop,或者onResume/onPause分别调用start和stop。在调用百度地图SDK时要在Manifest.xml文件中配置权限代码如下:

<uses-permission android: name="android. Permission. ACCESS NETWORK STATE"/>

<uses-permission android: name="android. Permission. ACCESS FINE LOCATION"/>

<uses-permission android: name="android. permission. INTERNET"/>

<uses-permission android: name="android. permission. WRITE EXTERNAL STORAGE"/>

<uses-permission android: name="android. Permission. ACCESS WIFI STATE"/>

<uses-permission android: name="android. Permission. CHANGE WIFI STATE/>

<uses-permission android: name="android. permission. READ PHONE STATE"/>

由于调用了百度地图功能,所以需要申请一个百度地图SDK的一个Key值。此key需要实现生命才可以获取授权使用地图功能[8]。用户从主界面登录,开启定位功能,即可得到所在位置。用户从主界面登录进入点击进入定位按钮开启定位功能,蓝色图标为当前位置,本人所在位置为郑州市金水区文化路97号。如图2:

3.1.2 路线查询

路径查询是一种特殊的检索服务。因此,在使用路径规划服之前首先要对检索相关的方法进行初始化。在使用检索服务时,需要明确唯一的起点和终点,否则将不能搜到所需结果;当起点或终点信息不唯一时,SDK会返回一个起点/终点列表,可通过选择列表中的信息来完成起点/终点的唯一选择,然后再进行路径搜索。路线查询模块包括自驾路线查询、公交路线查询和步行路线查询等功能。

自驾路线通过drivingSearch(String startCity, MKPlanNode start, String endCity, MKPlanNode end)来实现[9]。同时还提供了带有途经点功能的驾车路线检索接口drivingSearch(String startCity, MKPlanNode start, String endCity, MKPlanNode end, ArrayList<MKWpNode> wpNodes)。获取结果并展示时,需要开发者实现MKSearchListener接口中的onGetDrivingRouteResult方法。实现代码如下:

public void onGetDrivingRouteResult (MKDrivingRouteResult result, int iError) {

If (result == null) {

return;

}

RouteOverlay routeOverlay = new RoutOverlay (MyMapActivity.this, mMapView);

routeOverLay. setData (result . getPlan (0).getRoute (0) );

mMapView.getOverlays ( ) . add(routeOverlay);

mmMapView.refresh ( );

公交路线查询是百度地图SDK集成的搜索服务,通过初始化MKSearch类,注册搜索结果的监听对象MKSearchListener,实现异步搜索服务。搜索的方法为transitSearch(String city, MKPlanNode start, MKPlanNode end)。city:为待查公交线路所在城市,start和end分别是起点和终点。获取结果的方法改为重写onGetTransitRouteResult方法。

步行路线搜索与驾车路线搜索类似,只需将mMKSearch.drivingSearch(null,     start, null, end)修改为mMKSearch.walkingSearch(null, start, null, end),获取结果的方法改为重写onGetWalkingRouteResult即可。点击路线规划,输入起点和终点,选择步行搜索,結果如下图所示:

3.1.3 休閑、娱乐查询

休闲、娱乐查询主要涉及城市检索功能,即在某一城市内搜索兴趣点信息。所使用的方searchInterest (String city, String key)。当使用各种检索服务完成检索功能后,用户需要针对相应的检索执行销毁操作,从而实现释放内存等资源释放资源的代码为mSearch.destory()。点击休闲娱乐查询按钮,输入所要查找城市及检索关键词,例:郑州,餐厅。实现效果图如图4:

3.2 相机模块

相机模块下有三个功能按钮分别是浏览图片、拍照/录像、浏览视频。SurfaceView用于设置相机的预览效果, 由 surfaceHolder来控制[10]。surfaceHolder是系统提供用来设置surfaceView的一个对象,通过surfaceView.getHolder()这个方法来获得。Camera类提供setPreviewDisplay(SurfaceHolder)的方法来连接surfaceHolder,提供startPreview()和stopPreview()来开启和关闭预览。 SurfaceHolder.Callback是个holder,用来显示surfaceView 数据的接口。 surfaceHolder必须设定一个setType()方法,这样拍完照后就可以在onActivityResult(int requestCode, int resultCode, Intent data)中获取到Bitmap对象。其关键代码如下:

Bitmap bitmap = (Bitmap) data.getExtras().get("data");

//将图像存储到sd卡之前,先检查一下sd卡是否可用。

String sdStatus = Environment.getExternalStorageState();

if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) {

Log.v("TestFile","SD card is not avaiable/writeable right now.");

return;

}

3.3 天气预报模块

天气预报模块包括气温、风力、空气质量、紫外线的天气情况的查询。可以根据输入城市名称来查询天气,操作简洁。天气预报模块用到WebService接口来获取数据。WebService是一种基于SOAP协议的远程调用标准,通过webservice可以将不同操作系统平台、不同语言、不同技术整合到一块[11]。在Android SDK中没有提供调用WebService的库。因此,需要使用第三方的SDK来调用WebService。适合手机的WebService客户端的SDK比较常用的是Ksoap2。可以将其从网上进行下载,并将jar包加入libs目录下。接下来调用WebService接口。可以从http://www.webxml.com.cn/WebServices/WeatherWebService.asmx获取免费的天气预报接口。通过调用里面的callWebService(String url, final String methodName,HashMap<String, String> properties,final WebServiceCallBack webServiceCallBack)就可以来获取想要的数据。

具体实现:首先创建HttpTransportsSE对象。通过HttpTransportsSE类的构造方法可以指定WebService的WSDL文档的URL;然后创建SoapObject对象,里面的参数分别是WebService的命名空间和调用方法名,设置调用方法的参数值,如果没有参数,就不设置,有参数的话调用SoapObject对象的addProperty(String name, Object value)方法将参数加入到SoapObject,对象中实例化SoapSerializationEnvelope,传入WebService的SOAP协议的版本号,将上面的SoapObject对象通过setOutputSoapObject(Object soapObject)设置到里面,并设置是否调用的是.Net开发的WebService和是否debug等信息。因为涉及到网络操作,所以使用了线程池来异步操作调用WebService接口,在线程中调用HttpTransportsSE对象的call(String soapAction, SoapEnvelope envelope)方法就能实现对WebService的调用,并且通过soapEnvelope.bodyIn获取WebService返回的信息,但是返回的信息是在子线程中,需要利用Handler来实现子线程与主线程进行转换,然后在Handler的handleMessage(Message msg)中将结果回调到callBack的参数中。输入查询城市然后效果图如图6:

3.4 个人中心模块

3.4.1 微博分享

用户在注册、登陆后可已将旅行心得、照片和视频分享到微博上。分享功能调用了shareSDK。为了集成ShareSDK,需要到ShareSDK官网注册并创建应用,获得ShareSDK的APPkey,然后下载压缩包。然后通过导入的方式导入到项目中[12-13]。

分享功能实质就是Onekeyshare方法的调用,这里通过oks对象可以输出提示信息。其关键代码如下:

public void onClick(View v){

//TODO 自动生成的方法存根

OnekeyShare oks = new  OnekeyShare( );

}

滑动九宫格点击新浪微博,登录成功后点击分享图标即可,如图7:

3.4.2 日记本

日记本模块可以记录用户的个人日记,需要使用Android自带了SQLite数据库。SQLite是一款轻型的数据库,占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合。SQLite处理速速很快,同时它是无类型的。用户可以保存任何类型的数据到所想要保存的任何表的任何列中。由于记事本功能依赖于SQLite数据库增删改查,所以需要一个数据库管理者。DatabaseHelper继承于SQLiteOpenHelper,旗下的onCreate方法用于生成数据库,onUpdate用于更新数据库。使用ListViewAdapter来管理记录条目,使用Intent方法来传值。其关键代码如下:

Intent intent = new Intent();

intent . putExtra ( "id" , cursor.getString(cursor. getColumnIndex( "_id " ) ) ) ;

intent . putExtra( "state" , ALERT_STATE) ;

// intent . putExtra( "state" , EDIT_STATE) ;

intent . putExtra ( "title" , cursor.getString( cursor. getColumnIndex( "title" ) ) ) ;

intent . putExtra ( "time" , cursor.getstring(cursor. getColumnlndex( "time" ) ) ) ;

intent . putExtra( "content " , cursor.getString(cursor . getColumnIndex( " content " ) ) ) ;

3.5 小助手模块

小助手模块由出行装备、旅行保健、安全常识、购物常识、权益保护、自驾知识、户外运动、摄影常识八个按钮功能组成的,主要提供给旅友一些常识。显示的txt格式文本信息使用setContentView(R.layout.xx)关联相应的xml文件实现。如图8:

4 结束语

该文基于android操作系统平台设计并实现了一种拥有定位、路线规划、拍照摄影、天气预报查询、微博分享等功能的综合型旅行软件。本软件的综合性能比单一的工具软件要出色,是基于android平台的精巧设计,其特点是:操作方便,界面简洁,实用性强。测试结果表明,该软件能方便人们的出游体验,给旅游者提供快捷的出行工具。

参考文献:

[1] 任克强, 李晓亮, 谢斌. 基于Android的手机导航系统设计与实验[J]. 实验技术与管理, 2014, 31(5): 131-135.

[2] 谭立兴, 吴亮, 张炜. 基于Android平台泰科教务軟件的设计与实现[J]. 软件工程, 2016 19(9): 23-26.

[3] 许浩海, 牛亚峰, 杜宣成, 等. 基于安卓平台的旅游社交软件的设计与开发[J]. 电脑知识与技术, 2014, 10(10): 2273-2276.

[4] 迟玉梁, 甘新玲, 李永. 基于Android平台的多人实时定位与交流系统的设计与实现[J]. 实验技术与管理, 2015, 32(9): 160-162.

[5] 余志龙. Android SDK开发范例大全[M]. 北京: 人民邮电出版社, 2010.

[6] 郭宏志. Android应用开发详解[M]. 北京: 电子工业出版社, 2010.

[7] 张国海. 基于Android SDK离线地图功能的实现[J]. 电脑知识与技术, 2014, 10(18): 4172-4174.

[8] 时光, 马维华, 魏金文. 基于Android4.4和百度地图的远程定位系统设计[J]. 单片机与嵌入式系统应用, 2014, 14(11): 39-41.

[9] 王亚州. 基于Android平台的景区路线查询系统设计[J]. 电子技术与软件工程, 2016(16): 70, 96.

[10] 牛军伟. 基于Android手机系统的摄像头图像高动态范围增强[D]. 景德镇: 景德镇陶瓷学院, 2010.

[11] 潘颖辉. 基于Android和嵌入式Web技术的智能家居系统设计[J]. 东北师大学报: 自然科学版, 2015, 47(1): 71-76.

[12] 刘宝. Android平台旅行记录和分享应用的设计与实现[D]. 北京: 北京交通大学, 2015.

[13] 肖楷乐. 基于Android系统的新闻客户端的设计与实现[D]. 北京: 北京邮电大学, 2017.