




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录TOC\o"1-3"\h\u326721绪论 1209991.1研究背景与意义 1139471.2国内外研究现状 1244051.3研究内容与目标 2262592理论技术基础 2322912.1理论基础 2224092.1.1.系统内核 2131302.1.2.后缀简介 2203802.1.3.硬件抽像层 3300992.1.4.中介软件 4137852.1.5.安全权限机制 4137492.1.6.百度地图定位 5119162.2技术基础 5275063系统分析与设计 6195683.1需求分析 6308693.1.1.编写目的 610783.1.2.术语定义
7309373.2总体设计 7156953.2.1.系统功能 735823.2.2.软件结构 8292303.2.3.程序流程图 890403.3详细设计 988113.3.1.总体界面设计 9153123.3.2.模块功能设计 10289774系统实现 11151864.1主要界面 1144384.2代码结构 13226604.3开发过程遇到的问题 20133035总结 2110389参考文献 2210246附录 24摘要现在几乎每个人都有移动设备,而随着科技的进步,移动设备已经不仅仅是通讯工具,也成为了人们手中的玩物,甚至成为一些其他的工具,而各种各样的移动应用出现在市场上,人们对移动应用的需求也渐渐增大。随着人们对健康生活方式的追求,他们对一些健康类应用的需求也越来越大。本论文从学习、研究和探讨的角度,介绍了Android开发的现状以及Android开发未来的发展趋势,然后以本系统为例从需求分析、应用技术、设计架构思想、系统详细模块实现上分别叙述了它的各种技术原理及实现方案,进而简单的阐明了Android开发以及百度地图API使用的相关技术。然后以本系统为例从需求分析、应用技术、设计架构思想、数据库设计、系统详细模块实现上分别叙述了它的各种技术原理及实现方案,进而简单的阐明了开发一个基于Android的健康类应用开发的相关技术。关键字:Android开发、百度地图API
ABSTRACTNowalmosteveryonehasamobiledevice,andwiththeprogressofscienceandtechnology,themobiledeviceisnotjustacommunicationtool,hasalsobecomeaplaythinginthehandsofthepeople,evenassomeoftheothertools,andavarietyofmobileapplicationsappearonthemarket,peopleonthemoveshouldusedemandalsograduallyincrease.Inthepursuitofahealthylifestyle,theirdemandforsomehealthclassapplicationisalsomoreandmorebig.Inthispaper,fromthestudy,researchandonthepointofview,thefuturedevelopmenttrendofAndroiddevelopmentandthedevelopmentofAndroid,andthentakethissystemastheexamplewithmodulefromrequirementanalysis,applicationtechnology,designthought,systemrealizationprincipleofvarioustechniquesaredescribedanditsimplementationscheme,andthensimplyexplainedAndroiddevelopmentandrelatedtechnologyBaidumapusingAPI.Andthentakethissystemastheexamplewithmodulefromrequirementanalysis,applicationtechnology,designarchitecture,databasedesign,systemrealizationprincipleofvarioustechniquesaredescribedanditsimplementationscheme,andthensimplyillustratesthedevelopmentofacorrelationbasedtechniquesandhealthdevelopmentofAndroidapplication.KeyWords:AndroidDevelope、BaiduMapAPI绪论研究背景与意义Android曾经是一家创立于旧金山的公司的名字,该公司于2005年8月份被Google收购,并从此踏上了飞速发展的道路。经过这几年的发展,它已经发展成了一个平台、一个生态体系。现在Android在移动领域已经得到了广泛的应用。根据Google于2011年6月份公布的数字,每天激活的Android设备高达50万台,今天,施密特再次更新了这一数据——现在,每天被激活的Android设备数量达到了150万份。谷歌安卓系统负责人桑德尔·湃柴(SundarPichai)2013年09月宣布,采用安卓移动操作系统设备的激活量已经超过10亿台。在全球销售的智能手机中,有四分之三采用安卓操作系统,并且有越来越多的平板电脑采用这个操作系统。相比于Symbian的日落西山,以及苹果的封闭、WindowsPhone的前途未卜,Android无疑代表了当前行业发展的主流趋势:开放平台取代了封闭平台。让参与者均能通过自己的努力而获益。从2008年9月公布1.0版本以来,经过近几年的跨越式发展,现在Android已经发展到了4.4版本。2013年9月4日凌晨,谷歌对外公布了Android新版本Android4.4KitKat(奇巧巧克力),并且于2013年11月01日正式发布,新的4.4系统更加整合了自家服务,力求防止安卓系统继续碎片化、分散化。目前市场上占主流的并不是4.4版本,当然,相信随着时间的推移,4.4及后续版本会得到越来越多的设备的支持。国内外研究现状目前国内的Android开发还是主要以应用开发为主,主要分成3类:为企业开发应用、开发通用应用(放到AndroidMarket或者其他AppMarket销售)以及游戏开发(放到AndroidMarket或者其他AppMarket销售)。第一类开发者一般身处规模较大的公司,这些公司主要为自有品牌或者其他品牌设计手机或者平板电脑的总体方案。除了根据需求对系统进行定制外,更多的工作在于为这些系统编写定制的应用。第二类开发者,一般处于创业型公司或者是独立开发者,他们的盈利方式主要是2种:为国外公司进行外包开发,或者通过Google的移动广告(AdMob)通过广告点击分成。而理论上的通过付费下载的形式来盈利的,现在国内鲜见成功者。第三类开发者,目前和第二类开发者类似。北京时间4月15日晚间消息,移动应用分析公司AppAnnie今日发布报告称,今年第一季度,谷歌GooglePlay应用商店在下载量方面依旧主导全球市场。报告称,第一季度GooglePlay全球应用下载量较AppStore高出45%,这主要得益于新兴市场的推动,如俄罗斯、巴西、墨西哥和土耳其,其发展速度令无数人惊叹,而Android产品占中国整体智能手机销量的更是令其他系统无法企及,这些数字意味着庞大的市场,自然能让应用开发商欲罢不能,但Android碎片化的多版本问题正愈演愈烈。两相比较间,不少开发商陷入了两难的境地。在Android开发者官方网站上,不少开发者亦吐露出“抓狂”的情绪。由于本质为开源,Android系统发展至今,几乎完全脱离了谷歌的控制,其花费巨大开发的新版本系统往往在手机厂商需要为新品添加噱头的时候才会用上。研究内容与目标根据如今安卓设备的普及,以及现如今人们越发的重视身体的健康,开始在闲暇的时间开展一些体育活动,一些与健康相关的安卓应用被人们需要,也更显现出它们的实用性。而我开发的则是一款基于安卓的跑步软件。它可以实现利用GPS以及百度地图API实现记录用户跑步路径以及跑步距离的功能。理论技术基础理论基础系统内核Android是运行于Linuxkernel之上,但并不是GNU/Linux。因为在一般GNU/Linux里支持的功能,Android大都没有支持,包括Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。Android又以Bionic取代Glibc、以Skia取代Cairo、再以opencore取代FFmpeg等等。Android为了达到商业应用,必须移除被GNUGPL授权证所约束的部份,例如Android将驱动程序移到Userspace,使得Linuxdriver与Linuxkernel彻底分开。Bionic/Libc/Kernel/并非标准的Kernelheaderfiles。Android的Kernelheader是利用工具由LinuxKernelheader所产生的,这样做是为了保留常数、数据结构与宏。Android的Linuxkernel控制包括安全(Security),存储器管理(MemoryManagement),程序管理(ProcessManagement),网络堆栈(NetworkStack),驱动程序模型(DriverModel)等。下载Android源码之前,先要安装其构建工具Repo来初始化源码。Repo是Android用来辅助Git工作的一个工具。后缀简介APK是安卓应用的后缀,是AndroidPackage的缩写,即Android安装包(apk)。APK是类似SymbianSis或Sisx的文件格式。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。apk文件和sis一样,把androidsdk编译的工程打包成一个安装程序文件,格式为apk。APK文件其实是zip格式,但后缀名被修改为apk,通过UnZip解压后,可以看到Dex文件,Dex是DalvikVMexecutes的全称,即AndroidDalvik执行程序,并非JavaME的字节码而是Dalvik字节码。APK文件结构一个APK文件结构为:1.META-INF\(注:Jar文件中常可以看到);2.res\(注:存放资源文件的目录);3.AndroidManifest.xml(注:程序全局配置文件);4.classes.dex(注:Dalvik字节码);5.resources.arsc(注:编译后的二进制资源文件)。总结下我们发现Android在运行一个程序时首先需要UnZip,然后类似Symbian那样直接执行安装,和WindowsMobile中的PE文件有区别,这样做对于程序的保密性和可靠性不是很高,通过dexdump命令可以反编译,但这样做符合发展规律,微软的WindowsGadgets或者说WPF也采用了这种构架方式。在Android平台中dalvikvm的执行文件被打包为apk格式,最终运行时加载器会解压然后获取编译后androidmanifest.xml文件中的permission分支相关的安全访问,但仍然存在很多安全限制,如果你将apk文件传到/system/app文件夹下会发现执行是不受限制的。最终我们平时安装的文件可能不是这个文件夹,而在androidrom中系统的apk文件默认会放入这个文件夹,它们拥有着root权限。硬件抽像层Android的HAL(硬件抽像层)是能以封闭源码形式提供硬件驱动模块。HAL的目的是为了把Androidframework与Linuxkernel隔开,让Android不至过度依赖Linuxkernel,以达成Kernelindependent的概念,也让Androidframework的开发能在不考量驱动程序实现的前提下进行发展。HALstub是一种代理人(Proxy)的概念,Stub是以*.so档的形式存在。Stub向HAL“提供”操作函数(Operations),并由Androidruntime向HAL取得Stub的Operations,再Callback这些操作函数。HAL里包含了许多的Stub(代理人)。Runtime只要说明“类型”,即ModuleID,就可以取得操作函数。中介软件操作系统与应用程序的沟通桥梁,应用分为两层:函数层(Library)和虚拟机(VirtualMachine)。Bionic是Android改良libc的版本。Android同时包含了Webkit,所谓的Webkit就是AppleSafari浏览器背后的引擎。Surfaceflinger是就2D或3D的内容显示到屏幕上。Android使用工具链(Toolchain)为Google自制的BionicLibc。Android采用OpenCORE作为基础多媒体框架。OpenCORE可分7大块:PVPlayer、PVAuthor、Codec、PacketVideoMultimediaFramework(PVMF)、OperatingSystemCompatibilityLibrary(OSCL)、Common、OpenMAX。Android使用skia为核心图形引擎,搭配OpenGL/ES。skia与LinuxCairo功能相当,但相较于LinuxCairo,skia功能还只是雏形的。2005年Skia公司被Google收购,2007年初,SkiaGL源码被公开,Skia也是GoogleChrome的图形引擎。Android的多媒体数据库采用SQLite数据库系统。数据库又分为共用数据库及私用数据库。用户可通过ContentResolver类(Column)取得共用数据库。Android的中间层多以Java实现,并且采用特殊的Dalvik虚拟机(DalvikVirtualMachine)。Dalvik虚拟机是一种“暂存器型态”(RegisterBased)的Java虚拟机,变量皆存放于暂存器中,虚拟机的指令相对减少。Dalvik虚拟机可以有多个实例(Instance),每个Android应用程序都用一个自属的Dalvik虚拟机来运行,让系统在运行程序时可达到优化。Dalvik虚拟机并非运行Java字节码(Bytecode),而是运行一种称为.dex格式的文件。安全权限机制Android本身是一个权限分立的操作系统。在这类操作系统中,每个应用都以唯一的一个系统识别身份运行(Linux用户ID与群组ID)。系统的各部分也分别使用各自独立的识别方式。Linux就是这样将应用与应用,应用与系统隔离开。系统更多的安全功能通过权限机制提供。权限可以限制某个特定进程的特定操作,也可以限制每个URI权限对特定数据段的访问。Android安全架构的核心设计思想是,在默认设置下,所有应用都没有权限对其他应用、系统或用户进行较大影响的操作。这其中包括读写用户隐私数据(联系人或电子邮件),读写其他应用文件,访问网络或阻止设备待机等。安装应用时,在检查程序签名提及的权限,且经过用户确认后,软件包安装器会给予应用权限。从用户角度看,一款Android应用通常会要求如下的权限:拨打电话、发送短信或彩信、修改/删除SD卡上的内容、读取联系人的信息、读取日程信的息,写入日程数据、读取电话状态或识别码、精确的(基于GPS)地理位置、模糊的(基于网络获取)地理位置、创建蓝牙连接、对互联网的完全访问、查看网络状态,查看WiFi状态、避免手机待机、修改系统全局设置、读取同步设定、开机自启动、重启其他应用、终止运行中的应用、设定偏好应用、震动控制、拍摄图片等。一款应用应该根据自身提供的功能,要求合理的权限。用户也可以分析一款应用所需权限,从而简单判定这款应用是否安全。如一款应用是不带广告的单机版,也没有任何附加的内容需要下载,那么它要求访问网络的权限就比较可疑。百度地图定位2.1百度地图定位原理图2.1百度地图定位原理图百度地图Android定位SDK是利用设备当前的GPS信息(GPS定位),基站信息(基站定位)和Wi-Fi信息(Wi-Fi定位)完成定位的。开发者在应用中成功集成百度定位SDK以后,既可以方便的通过定位SDK的接口向百度定位服务请求位置信息。定位SDK会根据设备当前的实际情况(如是否开启GPS,是否连接网络,是否扫描到Wi-Fi信息等)生成定位依据,并根据开发者设置的实际定位策略(包括三种:高精度模式,低功耗模式,仅用设备模式)进行定位。技术基础本次开发主要用到AndroidSDK以及百度地图的API,开发工具采用Eclipse导入Android开发包、百度地图API以及百度定位技术的API,如图2.2图2.2导入Android开发包图2.2导入Android开发包而在安卓应用的开发过程中,需要使用的安卓模拟器,而本次开发前期所使用到的则是Android自带模拟器。自带的模拟器主要用于检查控件的功能以及设计是否完善。由于本次开发需要用到GPS以及移动网络的支持,开发中主要功能的测试依赖于移动安卓设备。选用的设备为三星i9500,即三星GalaxyS4。三星SamsungGalaxyS系列新一代的旗舰GalaxyS4它采用了像素密度为441ppi(480dpi)的5吋1080p(1,920x1,080)SuperAMOLEDHD屏幕和2GBRAM,处理器根据地区不同分为两种版本,国际版为双四核1.6GHz+1.2GHz的Exynos处理器,定制版本是四核1.9GHz的高通骁龙600处理器或骁龙800处理器,配备有1280万后置摄像头和210万像素的前置摄像头,支持蓝牙4.0技术和NFC近场通讯等功能。上市时预载的系统是Android4.2.2。使用的设备定位以及对软件支持方面能够非常出色的满足开发要求,测试是开发中不可忽视的重要环节。系统分析与设计需求分析编写目的现在的人们越来越重视健康,因此出现了许多跑步爱好者。而他们需要一些工具来记录自己跑过的路径和跑步的距离,以此来判断自己的运动程度是否达到自己满意的程度。而现在多数人都拥有Android设备,并且考虑到Android的开源性,Android的开发相对比较实际。所以本次要开发一个基于Android系统的跑步软件。
术语定义
Activity:Activity是Android组件中最基本也是最为常见用的四大组件(Activity,Service服务,ContentProvider内容提供者,BroadcastReceiver广播接收器)之一。Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某 项任务。Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setContentView(View)来显示指定控件。在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。Intent:Intent(意图)主要是解决Android应用的各项组件之间的通讯。Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。百度定位SDK:百度地图Android定位SDK是为Android移动端应用提供的一套简单易用的LBS定位服务接口,专注于为广大开发者提供最好的综合定位服务,通过使用百度定位SDK,开发者可以轻松为应用程序实现智能、精准、高效的定位功能。百度地图SDK:百度地图AndroidSDK是一套基于Android2.1及以上版本设备的应用程序接口。您可以使用该套SDK开发适用于Android系统移动设备的地图应用,通过调用地图SDK接口,您可以轻松访问百度地图服务和数据,构建功能丰富、交互性强的地图类应用程序。API:API(ApplicationProgrammingInterface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。总体设计系统功能针对本系统的设计,主要实现两个功能:用户在使用时,可以通过地图随时查看跑步的路径用户在使用时,可以随时查看自己已经跑过的距离通过这两个功能可以让用户做到对自己的运动状况有所掌控,对自己的运动情况心中有数。软件结构本系统共有一个Activity,在这个Activity中要实现查看地图,查看跑步距离。则要分出地图定位模块,距离计算以及路程记录模块。图3.1软件结构Activity地图初始化以及定位计算跑步距离以及绘制路线图程序流程图图3.1软件结构Activity地图初始化以及定位计算跑步距离以及绘制路线图出现应用界面选择按钮出现应用界面选择按钮结束开始记录跑步数据是否查看地图显示地图输出跑步距离是否关闭地图开始退出是是是否退出跑步完成是图3.2程序流程图当用户进入到界面后,选择开始按钮,则开始计时并且记录跑步的数据,在界面上输出用户跑步的距离;这时候用户可以选择查看地图或者暂停;当查看地图用户选择查看地图后,可以看到自己跑步的路线,可以对地图进行缩放;然后用户可以关闭地图,回到主界面,使地图在后台运行;最后用户可以选择关闭应用程序。详细设计总体界面设计主界面时间时间距离开始退出显示已经运动的时间实际是一个计时器显示已经运动的距离开始按钮触摸后开始计时并且启动定位等功能退出按钮触摸后退出应用图3.3主界面开始跑步界面时间时间距离暂停退出显示已经运动的时间实际是一个计时器显示已经运动的距离暂停按钮触摸后暂停计时并且暂停定位等功能退出按钮触摸后退出应用查看地图触摸后跳转到地图界面用以查看跑步路线图3.4开始跑步界面地图界面显示地图并且显示在地图上已经绘制好的路线图显示地图并且显示在地图上已经绘制好的路线图控制地图的缩放触摸后关闭地图回退到原来的跑步界面关闭地图地图缩放控件图3.5地图界面模块功能设计系统分为两个模块:定位模块与绘制地图模块虽然分为两个模块,但是两个模块之间并不是完全没有关联,因为在定位的同时要绘制用户经过的线路。而且记录用户跑步的距离并不能只记录用户的起点和终点,因为百度地图计算的是两点之间的直线距离,只是依据起点和终点来计算将会造成计算出的距离与用户实际跑步的距离不相符合的情况。而这里用到了数学中“微量元素”的思想。记录用户短时间内的起点与终点之间的距离,然后将这些短时间运动的距离相加最终可近似的得到用户跑步的最终距离。这样的方式所得到的距离误差小到可以忽略不计,而且绘制出来的跑步路径也最接近用户真实的跑步路线。定位模块这个模块中需要初始化地图信息以及定位信息,设置定位相关的参数,并且在用户开始跑步后立即启动定位功能。而这个定位相应的用到了百度定位SDK以及百度地图SDK。通过调用百度地图的接口,可以实时获得用户当前的位置,即用户当前位置的经度纬度坐标。在这个模块中,将地图以及定位信息初始化,同时设置按钮的监听,一旦用户开始跑步,立即开启定位功能,在后台每隔很短的一段时间获取用户的经度纬度坐标。绘制地图模块这个模块中要绘制用户跑步的路径,将其在百度地图上标记出来,并且同时统计用户跑步的距离。计算距离的方式上文中已经说明,在此不再赘述。这并不是一个独立的模块,这个模块需要在上一个模块的基础上来操作。而绘制的路线相当于在百度地图上新增加的图层上进行绘制。但是在用户看来只是一个图层。而绘制路线的方式也是用折线来近似表示曲线,在视觉上看来并没有偏差。而绘制路线以及计算距离需要用到百度地图API,对百度地图提供的接口加以更改就可以达到本次开发的目的。系统实现主要界面界面大约有三个主要的界面,分别为主界面,跑步开始界面以及查看地图界面。主界面图4.1主界面当用户打开应用便进入主界面,在这里用户可以开始跑步,也可以退出应用。图4.1主界面开始跑步界面跑步开始便显示用户跑步的距离,时间等信息,详细解说如下图:这里显示用户这里显示用户已跑步时间这里显示用户已跑步距离暂停按钮触摸后暂停计时和定位查看地图按钮触摸后跳到地图界面图4.2开始跑步界面查看地图查看地图界面,在这里用户可以方便的查看到自己跑步所经过的路径,详细解说见下图:这里用红线这里用红线标注出用户所经过的路程缩放控件控制地图缩放级别也可以用两个手指同时控制关闭地图回到上一个界面图4.3查看地图界面代码结构本次开发有一个Activity,除此之外还有一个用来绘制路线图的类,具体如下:MapActivity类:继承android.app.Activity,本Activity中需要初始化地图还有定位信息,并且为地图设置监听函数,每隔一秒钟更新一次用户的位置信息,并且更新用户路线还有用户跑步距离等信息。具体介绍如下:包含两个内部类:locationOverlay类:继承com.baidu.mapapi.map.MyLocationOverlay,这个类是用来给地图添加泡泡图层,即用户触摸地图上当前位置点时会弹出一个图层,告知用户这个点为现在所处的位置。MyLocationListenner类:实现com.baidu.location.BDLocationListener接口,BDLocationListener接口有2个方法需要实现:onReceiveLocation方法:接收异步返回的定位结果,参数是BDLocation类型参数。主要代码://判断是否是第一次定位,第一次则给前一次定位坐标(preLocData)赋初始值,如果不是第一次定位则将上一次定位得到的数据赋值给preLocData用来记录前一次的位置if(isFirstLoc==true){ preLocData.latitude=location.getLatitude(); preLocData.longitude=location.getLongitude();}else{ preLocData.latitude=locData.latitude; preLocData.longitude=locData.longitude;}//获取当前位置信息 locData.latitude=location.getLatitude();locData.longitude=location.getLongitude();//调用绘制路线函数,在地图上绘制路线图DrawGraphic();onReceivePoi方法:接收异步返回的POI查询结果,参数是BDLocation类型参数。主要函数:onCreate方法:OnCreate()不产生窗口,只是在窗口显示前设置窗口的属性如风格、位置等,Create()负责注册并产生窗口,是整个Activity的入口。在这里我们初始化了地图以及定位信息的参数。主要代码:super.onCreate(savedInstanceState);//调用父类onCreate函数//初始化地图管理类对象,获取当前的Application,初始化地图mBMapMan=newBMapManager(getApplication());mBMapMan.init(null);setContentView(R.layout.activity_map);//设置Activity的布局文件//将这个activity添加到activity管理列表ManageActivity.getInstance().add("MapActivity",this);//初始化控件ch=(Chronometer)findViewById(R.id.map_chronometer1);//计时器start=(Button)findViewById(R.id.map_start);//开始按钮stop=(Button)findViewById(R.id.map_stop);//暂停按钮showMap=(Button)findViewById(R.id.map_show);//查看地图按钮closeMap=(Button)findViewById(R.id.map_closemap);//关闭地图按钮ed=(EditText)findViewById(R.id.map_showdistance);//显示距离文本distance=0;//初始化距离参数this.firstTime=true;//初始化标记是否是第一次定位//设置按钮Button的可见度stop.setVisibility(View.GONE);closeMap.setVisibility(View.GONE);showMap.setVisibility(View.GONE);//地图对象赋值mMapView=(MapView)findViewById(R.id.bmapView);mMapController=mMapView.getController();mMapView.getController().setZoom(14);mMapView.getController().enableClick(true);mMapView.setBuiltInZoomControls(true);//设置启用内置的缩放控件MapControllermMapController=mMapView.getController();onClick方法:这个是控件的触摸事件函数,当触摸控件时便执行这个函数。这个函数的主题其实是switch结构,用来判断控件是否被触摸,相应的执行操作。主要代码:booleanisStart=true; switch(v.getId()){ caseR.id.map_show:{ mMapView.setVisibility(View.VISIBLE); start.setVisibility(View.GONE); stop.setVisibility(View.GONE); ch.setVisibility(View.GONE); showMap.setVisibility(View.GONE); ed.setVisibility(View.GONE); closeMap.setVisibility(View.VISIBLE); break; } caseR.id.map_start:{ if(isStart){ //定位初始化 mLocClient=newLocationClient(this); locData=newLocationData(); preLocData=newLocationData(); mLocClient.registerLocationListener(myListener); LocationClientOptionoption=newLocationClientOption(); option.setOpenGps(true);//打开gps option.setCoorType("bd09ll");//设置坐标类型 option.setScanSpan(1000); //设置定位时间间隔 mLocClient.setLocOption(option); mLocClient.start(); //创建弹出泡泡图层 createPaopao(); //定位图层初始化 myLocationOverlay=newlocationOverlay(mMapView); //设置定位数据 myLocationOverlay.setData(locData); //添加定位图层 mMapView.getOverlays().add(myLocationOverlay); myLocationOverlay.enableCompass(); //修改定位数据后刷新图层生效 mMapView.refresh(); } //开始计时 if(this.firstTime){ ch.setBase(SystemClock.elapsedRealtime()); this.firstTime=false; showMap.setVisibility(View.VISIBLE); } else{//调整计时器暂停后的值 longtemp=(long) (Double.parseDouble(ch.getText().toString().split(":")[1])*1000); ch.setBase(SystemClock.elapsedRealtime()-temp); } ch.start();//计时器开始 start.setVisibility(View.GONE); stop.setVisibility(View.VISIBLE); isStart=false; break; } caseR.id.map_stop:{ //暂停计时 ch.stop(); longtemp=(long)(Double.parseDouble(ch.getText().toString().split(":")[1])*1000); ch.setBase(SystemClock.elapsedRealtime()-temp); stop.setVisibility(View.GONE); start.setVisibility(View.VISIBLE); mLocClient.stop();//暂停定位 isStart=true; break; } caseR.id.map_closemap:{ mMapView.setVisibility(View.INVISIBLE); closeMap.setVisibility(View.INVISIBLE); showMap.setVisibility(View.VISIBLE); ch.setVisibility(View.VISIBLE); ed.setVisibility(View.VISIBLE); if(!isStart){ start.setVisibility(View.VISIBLE); }else{ stop.setVisibility(View.VISIBLE); } }onDestroy方法:activity被完全从系统内存中移除时调用,该方法被调用。onPause方法:activity被暂停或收回cpu和其他资源时调用,该方法用于保存活动状态的,也是保护现场,压栈。onResume方法:activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)。DrawGraphic方法:在这个函数中调用画图的类对象,并且在这里累加用户的短时间移动距离。主要代码:this.dg=newDrawGraphics(this);//给字段DrawGraphics类对象dg申请空间 dg.addCustomElementsDemo();//调用DrawGraphic类中的画图方法 this.distance+=dg.getDistance();//更新距离(distance)MyLocationMapView类:继承com.baidu.mapapi.map.MapView类,重写onTouchEvent实现泡泡处理操作。DrawGraphics类:在这个类中对图层进行操作,可以在图层上绘制图形,这里主要是绘制直线,同时也记录直线两端之间的距离,函数具体介绍如下:DrawGraphics方法:构造方法,在这里初始化一些需要的参数。addCustomElementsDemo方法:在这里调用绘制图形的方法,并且将地图刷新。主要代码:GraphicsOverlaygraphicsOverlay=newGraphicsOverlay(mMapView);mMapView.getOverlays().add(graphicsOverlay); //添加折线graphicsOverlay.setData(drawLine());//执行地图刷新使生效mMapView.refresh();drawLine方法:确定两个点,在两个点之间绘制直线。主要代码://前一次的位置信息doublemLat=preLoc.latitude; doublemLon=preLoc.longitude; intlat=(int)(mLat*1E6); intlon=(int)(mLon*1E6); GeoPointpt1=newGeoPoint(lat,lon); //当前位置信息 mLat=locData.latitude; mLon=locData.longitude; lat=(int)(mLat*1E6); lon=(int)(mLon*1E6); GeoPointpt2=newGeoPoint(lat,lon); //构建线 GeometrylineGeometry=newGeometry(); //设定折线点坐标 GeoPoint[]linePoints=newGeoPoint[2]; linePoints[0]=pt1; linePoints[1]=pt2; lineGeometry.setPolyLine(linePoints); //设定样式 SymbollineSymbol=newSymbol(); Symbol.ColorlineColor=lineSymbol.newColor(); lineColor.red=255; lineColor.green=0; lineColor.blue=0; lineColor.alpha=255; lineSymbol.setLineSymbol(lineColor,10); //生成Graphic对象 GraphiclineGraphic=newGraphic(lineGeometry,lineSymbol); countDistance(pt1,pt2); returnlineGraphic;countDistance方法:计算两个点之间的直线距离。主要代码:publicvoidcountDistance(GeoPointp1,GeoPointp2){ //起点坐标 GeoPointstart=p1; //终点坐标 GeoPointstop=p2; GeoPoint[]routeData=newGeoPoint[2]; routeData[0]=p1; routeData[1]=p2; //用站点数据构建一个MKRoute MKRouteroute=newMKRoute(); route.customizeRoute(start,stop,routeData); distance=route.getDistance();}开发过程遇到的问题在开发过程中,因为使用了百度地图的接口,所以在使用时需要做一些开发的准备工作,百度地图的使用需要去百度地图的官方网站去申请一个唯一的密钥才可以在开发中合法使用百度地图。(申请密钥的方法见附录)在开发过程中由于存在两种获取SHA1值的方式,而本次开发遇到两种方法得到的SHA1值不一致的情况。导致按照正确步骤申请的密钥也不能够正常使用的情况,最终发现系统本身的密钥库与Eclipse自带的密钥库并不统一,最终将两个密钥库统一起来再重新申请了密钥之后便将问题成功的解决了。Android提供的计时器暂停之后再开始并不是在暂停的那个基础上再开始计时。这里需要明白Android计时器的工作原理,它是告诉计数器一个基础的时间,然后读取系统的时间再减去这个基础时间,所以就算把计时器暂停,基础时间并没有改变,所以就会出现原来所说的那种情况。为了解决这个问题,需要在原来的基础上减去中间的那段暂停时间,再开始计时。总结优点:本系统使用起来比较容易,实现的功能能够满足用户的基本需求。使用了百度地图,能够方便查看用户跑步的线路图。本系统能够较为方便的查看用户跑步的距离。本系统的设计简单明了,便于用户使用。开发的应用比较简单,所以不足之处当然是存在的。继续研究方向:为本系统加入数据库系统,用于记录用户每次运动的情况,可以让用户回顾每次跑步的情况。对自己的运动状态有一个大的掌控。本系统在运行时用到GPS,所以在室内不能够满足用户的需求。假如用户在室内运动,可以让用户自己调整应用记录的模式,在室内不使用GPS定位,可以用传感器来感知用户的运动。可以在用户运动的同时,添加语音的提示。可以让用户实时掌握自己运动的状况。实时播报用户的跑步速度,时间等等。
参考文献百度地图官方网站(/map/)百度百科(/)安卓官方网站(/)李刚.疯狂Android讲义[M].电子工业出版社,2011年6月Android
A
Programmer’s
Guide
.
Jerome(J.F.)DiMarzioDOI:10.1036、0071599886
林城.Android2.3应用开发实战[J].机械工业出版社,2011韩超.Android经典应用程序开发[J].人力资源出版社,2011(美)CayS.Horstmann,GaryCornell.Java核心技术[J].机械工业出版社,2008杨云君.Android的设计与实现:卷I.机械工业出版社.2013年王晓敏,邝孔武.清华大学出版社.2013
致谢本设计在王超老师的悉心指导和严格要求下业已完成,从课题选择、方案论证到具体设计和调试,无不凝聚着王超老师的心血和汗水,在四年的本科学习和生活期间,也始终感受着导师的精心指导和无私的关怀,我受益匪浅。在此向王超老师表示深深的感谢和崇高的敬意。不积跬步何以至千里,本设计能够顺利的完成,也归功于各位任课老师的认真负责,使我能够很好的掌握和运用专业知识,并在设计中得以体现。正是有了他们的悉心帮助和支持,才使我的毕业论文工作顺利完成,在此向河北农业大学计算机系的全体老师表示由衷的谢意。感谢他们四年来的辛勤栽培。附录介绍百度地图API使用密钥获取步骤:登陆API控制台图附录-1登陆API控制台登录会跳转到API控制台服务,具体如下图:图附录-1登陆API控制台创建应用图附录-2创建应用点击"创建应用",系统将为您弹出创建AK页面,输入应用名称,将应用类型改为:“formobile”:图附录-2创建应用图附录-3创建应用配置应用图附录-3创建应用图附录-4配置应用在应用类型选为“formobile”后,需要配置应用的安全码,如下图所示:图附录-4配置应用获取安全码输入“安全码”。安全码的组成规则为:Android签名证书的sha1值+“;”+packagename(即:数字签名+分号+包名)注意:中间的分号为英文状态下的分号!您可以通过两种方法来获取Android签名证书的sha1值:(需事先配置好Android环境)获取sha1值第一种方法:使用keytool第1步:运行进入控制台图附录-6控制台图附录-5运行控制台图附录-6控制台图附录-5运行控制台第2步:定位到.android文件夹下,输入cd.android图附录-7定位到.Android文件夹下第3步:输入keytool-list-v-keystoredebug.keystore,会得到三种指纹证书,选取SHA1类型的证书(密钥口令是android)图附录-7定位到.Android文件夹下图附录-8输入口令其中keytool为jdk自带工具;keystorefile为Android签名证书文件图附录-8输入口令图附录-9查看指纹证书第二种方法:在adt22中直接查看图附录-9查看指纹证书如果使用adt22,可以在eclipse中直接查看:winows->preferance->android->build。如下图示:图附录-10在Eclipse中查看指纹证书其中“SHA1fingerprint”值即为Android签名证书的sha1值图附录-10在Eclipse中查看指纹证书获取包名包名是Android应用程序本身在AndroidManifest.xml中定义的名称,例如:图附录-11查看包名成功创建KEY图附录-11查看包名在输入安全码后,点击“确定”完成应用的配置工作,您将会得到一个创建的Key,请妥善保管您所申请的Key。到这您就可以使用新Key来完成您的开发工作了。图附录-12成功创建KEY图附录-12成功创建KEY基于C8051F单片机直流电动机反馈控制系统的设计与研究基于单片机的嵌入式Web服务器的研究MOTOROLA单片机MC68HC(8)05PV8/A内嵌EEPROM的工艺和制程方法及对良率的影响研究基于模糊控制的电阻钎焊单片机温度控制系统的研制基于MCS-51系列单片机的通用控制模块的研究基于单片机实现的供暖系统最佳启停自校正(STR)调节器单片机控制的二级倒立摆系统的研究基于增强型51系列单片机的TCP/IP协议栈的实现基于单片机的蓄电池自动监测系统基于32位嵌入式单片机系统的图像采集与处理技术的研究基于单片机的作物营养诊断专家系统的研究基于单片机的交流伺服电机运动控制系统研究与开发基于单片机的泵管内壁硬度测试仪的研制基于单片机的自动找平控制系统研究基于C8051F040单片机的嵌入式系统开发基于单片机的液压动力系统状态监测仪开发模糊Smith智能控制方法的研究及其单片机实现一种基于单片机的轴快流CO〈,2〉激光器的手持控制面板的研制基于双单片机冲床数控系统的研究基于CYGNAL单片机的在线间歇式浊度仪的研制基于单片机的喷油泵试验台控制器的研制基于单片机的软起动器的研究和设计基于单片机控制的高速快走丝电火花线切割机床短循环走丝方式研究基于单片机的机电产品控制系统开发基于PIC单片机的智能手机充电器基于单片机的实时内核设计及其应用研究基于单片机的远程抄表系统的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 科技医疗的未来趋势与挑战-基于循证医学的研究视角
- 20以内乘法除法口算练习题本1000道可打印
- 20以内乘法除法口算练习题本1000道可打印
- 拟南芥amiRNA-RUS6 rus4转基因株系的构建及RUS6作用分析
- 科技背景下考试答题时间管理新动向
- 非营利机构教师发展计划
- 未来城市办公新模式空间结构创新探索
- 家长参与的六年级语文教学计划探讨
- 2025年中小学党支部发展战略计划
- 贷款担保协议书(2篇)
- 地理-浙江省强基联盟2025年2月高三年级联考试题和答案
- 2025《医药企业防范商业贿赂风险合规指引》解读课件
- 血透病人皮肤瘙痒课件
- 2025年度船舶焊接维修工程合同范本资料下载
- 贵州茅台课程设计
- 工业摄像头知识培训课件
- 2024-2025学年六年级数学人教版上册寒假作业(综合基础复习篇含答案)
- DB33T 1134-2017 静钻根植桩基础技术规程
- 楼梯塑料滴水线施工方案
- 《用电检查与稽查》课件
- 心理健康主题班会课件73
评论
0/150
提交评论