基于Android系统的手机地图APP-毕业论文_第1页
基于Android系统的手机地图APP-毕业论文_第2页
基于Android系统的手机地图APP-毕业论文_第3页
基于Android系统的手机地图APP-毕业论文_第4页
基于Android系统的手机地图APP-毕业论文_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本科生毕业设计本科生毕业设计题目:基于Android系统的手机地图APP目录TOC\o"1-2"\h\z\u摘要 IAbstract II第1章绪论 11.1课题研究的背景和目的 11.2国内外研究现状 11.3研究内容和设计结构 3第2章课题设计相关技术概述 42.1开发语言 42.2Android的架构 42.3AndroidSDK 5第3章软件需求性分析 63.1可行性 63.2需求分析 73.3业务流程 7第4章百度Key(密钥)申请 94.1申请百度密钥 94.2将Key添加到manifests文件application当中 12第5章系统设计 135.1系统功能结构 135.2声明软件应用权限 135.3基本配置 14第6章系统实现 166.1系统运行环境和开发平台 166.2系统开机闪屏页面 176.3地图主界面 186.4实时路况界面 226.5视图界面 236.6搜索界面 256.7导航界面 29第7章地图上线 367.1预期测试结果 367.2实际测试结果 36结束语 38参考文献 39致谢 40PAGE42基于Android系统的手机地图APP摘要本设计是一款适用于Android系统移动地图应用,其中调用的是百度地图AndroidSDK是一套基于Android2.1及以上版本的移动设备应用接口。在手机地图领域做得最好的就当数谷歌地图和百度地图了,并且这两种地图都提供了丰富的API[1],使得任何开发者都可以轻松地将地图功能引入到自己的应用程序当中。通过调用地图SDK接口可以轻松访问在手机上访问百度地图服务和数据,可以构建功能丰富、并且交互性强的手机移动地图应用程序。UI设计方面借鉴了百度简约的设计风格,简单明了又不失独特。Java开发语言和最新的AndroidStudio开发软件为本应用提供了稳定的开发环境及开发平台,通过设计本应用可以提供地图展示(城市热力图、卫星地图、城市实时路况信息图)地图定位和地图操作功能,支持城市内POI检索并进行Place详情列表展示,根据POI检索结果和长按地图设置目的地的操作会进行覆盖物标注从而展示更加丰富的地图。目前还可以支持百度地图的调启功能包括(驾车导航和骑行导航),根据导航又可以分成模拟导航和实时导航两部分。其中模拟导航作为创新点则间接具备了提前查看实时行驶交通,查看线路规划的功能从而提高导航效率。关键词:地图导航;百度地图;Java;AndroidSDK

MobilephonemapbasedonAndroidsystemAbstractThisdesign

is

a

mobile

map

application

for

Android

system,which

callsthe

Baidu

map

Android

SDK,it

is

a

set

of

Android2.1

and

above

versions

of

mobile

device

application

interface.

Google

Maps

and

Baidu

maps

are

the

best

in

the

field

of

mobile

maps,

because

both

maps

provide

a

rich

of

API,

making

any

developer

can

easily

use

map

functions

attach

into

their

applications

[

1].

By

calling

the

Map

SDK

interface

you

can

easily

access

the

Baidu

map

service

and

data

on

your

phone

,also

can

build

feature-rich

and

interactive

mobile

map

application.

And

UI

design

borrowed

from

Baidu

simple

design

style,

it's

concise

and

unique.

The

Java

development

language

and

the

latest

development

software

for

Android

Studio

provide

a

stable

development

environment

and

development

platform

for

it.The

design

can

provide

map

display

(city

heat

map,

satellite

map,

city

real-time

traffic

information

map)

,positioning,operation

function

and

support

to

the

city

POI

search

and

show

the

details

of

the

list.According

to

the

POI

search

results

and

long-press

the

map

to

set

the

destination

operation

will

be

covered

to

show

a

richer

map.

At

the

present

it

also

can

support

the

call

function

from

Baidu

map

include

(driving

navigation

and

riding

navigation).According

to

navigation,it

can

be

divided

into

two

partssimulation

navigation

and

real-time

navigation.The

simulation

navigation

as

a

innovative,it

has

a

view

look

over

real-time

traffic

and

route

planning

function

in

advance

,so

it

improve

navigation

efficiency.

Keywords:

map

navigation;

Baidu

map;

Java;

Android

SDK第1章绪论1.1课题研究的背景和目的移动互联时代早就已经来临了,说明新的时代新的技术已经越来越成熟。当移动通信和互联网结合在一起之后就形成了我们常说的移动互联网,我们的手机和笔记本电脑以及其他的移动设备可以随时随地的访问互联网的任何资源以及需要查找的手机应用软件,本毕业设计我已经上传到了百度开发者平台通过扫描本论文末尾的二维码即可下载。我们的智能手机是互联网背景下非常具有标志性的一个移动终端以及客户端的工具,其实就相当于一台“小型的电脑”,比如android系统就相当于它独立的操作系统,可以安装和卸载软件,也可以通过开启无线网络端口自由的接入断开通信网络,可以通过SD卡获得很大的存储空间和强大的计算数据功能,这就和传统的手机有了很大的区别。在这个网络技术日新月异的促进下,我国在通信技术领域早已经进入了第四代,即4G时代的出现,让我们可以享受到更加快速的网络传输速度和更智能的手机移动设备。现如今手机成为了我们日常生活中必不可少的一道甜点。随着现在科技的进步人们的生活水平在不断提升,人们已经不用思考柴米油盐和温饱问题而开始热衷于如何提升生活的质量,所以普通只可以打电话发短信的手机已经无法满足人们的需要了。于是产生了智能手机。通过相关调查研究表明人们对于智能手机的使用率已经达到了90%以上,智能手机也被开发者设计得越来越人性化,人们可以通过手机将完成越来越人性化的功能,可以说智能手机已经成为了人们生活的一部分。随着越来越多的人通过android来解决问题,现在和地图相关的APP在手机上的应用已经可以算是非常广泛了,和传统电脑PC端的地图软件相比之下手机地图APP可以具备随时随地查看并且可以非常轻松的规划出出行路线并且还能够进行导航,方便度有了明显的差距。所以我们可以开发出一款手机移动端地图来方便人们的生活。1.2国内外研究现状手机以及一些其他的移动设备为人们带来了越来越多越来越方便的生活,不断出现的手机地图系统的相关软件为在外出行的人提供了途径,节约了时间也极大地提高了效率。所以和手机地图相关的研究在学术研究中开始慢慢显现出来了,其中就包括了市场数据研究和应用数据研究。根据报告,2015年中国IT研究中心的相关研究对目前市场上份额排名前几位的地图软件展开了调查,通过调查对前几位的软件进行了排名,根据结果显示,目前百度手机地图排名第一,市场份额65.5%,由此可见更多人愿意使用百度地图来,高德地图排名第二,市场份额20.1%,搜狗地图排名第三,市场份额8.4%。15年手机地图市场份额如图1-1所示:图1-12015年手机地图累计市场份额手机地图作为移动互联网的重要入口之一,各互联网巨头纷纷加大资源投入力度,展开对手机地图市场的争夺。2014年高德地图经历了换帅,宣布发力LBS,专注位置解决方案,打出“你敢用就敢赔”的活动;百度地图则展开国际化战略,新提供境外地图数据,与相关地图合作开放全球定位能力;搜狗地图成为苹果官方AppleWatch首批邀请入驻的应用。在此背景下,从2015年第1季度中国手机地图主要APP的累积用户数、活跃用户数、用户关注度、用户日均定位请求数等相关指标说明现在的中国手机地图的市场情况。CNIT分析认为,手机地图市场集中度高。百度地图、高德地图和搜狗地图位列三甲,份额超90%,这和手机地图产品特性有关,需相应的资质才能运营,且还需实时更新相关数据,构成一定的技术门槛。15年中国活跃用户市场份额如图1-2所示:图1-22015年中国活跃用户市场份额比达(BigData)数据显示,在2015年Q1中国手机地图活跃用户市场份额中,百度地图67.9%最高,高德地图19.7%居第二,搜狗地图8.5%位第三,另外,腾讯地图、谷歌地图2.4%。因此以百度地图SDK作为载体根据百度API提供的文档来进行开发不仅和获得更加全面的数据而且性能无疑是最佳的。1.3研究内容和设计结构1.地图的定位和我的位置功能在本地图APP软件的设计中,用户通过安装打开软件之后立刻会定位到当前位置并同时报出当前位置名称。并通过添置按钮设置相应的单击事件从而在用户滑动地图到其他位置后可以通过此按钮迅速回到当前位置。2.方向传感器和自定义图标我们都知道智能手机里面内置了很多传感器,例如:方向传感器、距离传感器、陀螺仪传感器以及重力传感器等。本应用通过调用手机的方向传感器从而判断用户当前机头所处方向,通过自定义图标来指示当前方向并通过方向的不同实时更新图标的方向位置。另外导航部分还将调用距离传感器来进行算路处理。3.基于城市的地点搜索功能采用下拉列表输入的方式来设置城市和搜索类型,从而获取到周边地点,首先会通过弹窗来显示出周边的位置信息,然后通过添加覆盖物的形式来标注出来。4.GPS导航功能本设计地图软件还提供智能导航功能,当前位置是设置自动默认为起点,通过长按地图上面的地点来设置目的地。同时会在目的地上面添加覆盖物来标注,设置完目的地之后点击“模拟导航或者实时导航”,将立刻进入导航模式。5.开启实时路况和城市热力图以及可以打开卫星地图通过设置相关按钮和相应的单击事件方法,用户可以通过点击相应的按钮来获取到相应风格的地图,查看卫星地图要考虑当地的环境和缩放比例。如果发现当前区域无地图可以将缩放比例缩小一点。第2章课题设计相关技术概述2.1开发语言Java语言作为目前使用排行第一的编程语言不仅具有C++面向对象的特点,还根据“低耦合,高内聚”[2]的手机应用程序设计特点摒弃了C++里面难以理解的指针和多继承的特点。因此Java语言就同时具有了功能强大和简单易用的特点,所以被很多开发人员采用。Java语言又是一种动态的编程语言,安全性高、分布式使用非常广泛而且可跨平台移植,现在的很多软件都是用Java语言来进行开发编写的,手机、个人笔记本、平板电脑等终端设备上面的很多软件都是通过Java语言的可移植跨平台的特性才能使用的只需要安Java开发环境[3]即可。Java程序具有与体系结构无关的特性,可以方便地移植到网络上的不同计算机当中。编程语言排行榜如图2-1所示:图2-1编程语言排行榜2.2Android的架构Android操作系统应用程序框架[4]支持组件的重用与替换。这在之前的手机操作系统中是难以想象的。这意味着我们可以吧系统中不喜欢的应用程序替换掉,安装我们自己喜欢的应用程序。因为系统架构主观上可分为四层架构,由下而上依次为应用层、应用框架层、系统运行库层、Linux内核层。1.Linux内核层Android系统的核心服务是基于Linux2.6内核的,这一层主要功能是让开发者编写底层程序从而为Android手机以及基于Android的设备的各种硬件设施提供底层驱动,比如为蓝牙相机、无线网络(WIFI)、电源设备、音频、显示器等进行驱动。2.系统运行库层这一层主要是为Android系统提供各种特性支持,比如数据库可以直接通过SQLite库来提供(也可以使用外部数据库如:MySQL),3D绘图支持可以通过OpenGL/ES库提供,浏览器内核可以通过Webkit库来提供等。同样还有一个运行时库,它包含一个核心库,可以让开发者运用Java语言来编写Android应用。另外Android的运行都是可以通过Dalvik虚拟机来进行,且都是独立运行进程。另外也可以通过真机来运行。总的来说相对于Java虚拟机来说,Dalvik针对于移动设备并且完全模拟手机还能够针对手机内存以及CPU来进行优化处理。3.应用框架层这一层可以理解为提供Android应用构建时可能用到的应用程序接口和组件也就是API。需要用来开发Android应用程序的工具都具备之后,Google为了大力推广Android,也希望所有应用程序开发者可以顺利地转移到Android平台,因此创建了一系列的应用程序架构[5]。应用程序的架构主要是为了简化程序组件的重用,从而在遵循框架安全性的前提下快速的的开发应用程。可以进行视图(views)扩展、优化、添加列表(lists)、按钮(buttons)、文本框(textboxes),甚至可以嵌入web浏览器。另外还包括四大组件分别是活动(Activity)、服务(Service)、广播接收器(BroadcastReceiver)和内容提供器(ContentProvider)。4.应用层这一层顾名思义就是手机上面的应用程序所在的这一层,比如系统自带的通讯录、短信、联系人等,自己网上下载或者进行自己开发的应用程序的真机测试应用。Android平台包括一些系统资源,所有的资源都可以直接从你的应用程序代码和使用。也可以从内部引用的其他资源。例如,一个维度中[6]引用资源可能布局的定义。2.3AndroidSDKSDK:软件开发工具包。比如百度地图SDK、ShareSDK等是在特定软件开发过程中,开发者用相应的软件开发工具包来进行特定的开发工作。AndroidSDK[7]以Java语言为基础,用户可以使用Java来开发来开发Android平台的应用软件。也是软件开发工具包,用于提供Android系统的不同版本的开发所需要的环境以及工具。在搭建硬件平台以及软件开发的框架时都需要通过引入该工具包,才能使用Android开发相关的API。 第3章软件可行性及需求分析3.1可行性软件开发过程中,不仅仅是考虑能不能用技术实现出来而是要全面性的来根据可行性考虑,软件能否成功开发不仅仅需要足够的技术还得要有经济和法律方面的考虑。下面就从技术、经济、法律三个方面来分析。1.技术是否可行?本课题的这款手机定位APP的设计实现最主要还是与程序设计相关,因此程序开发语言尤其重要,并且这种语言开发的应用必须能够在Android手机上面安装运行。所以目前来说现阶段的开发语言当中,Java语言和C语言等已经面世并且相对来说比较成熟和稳定的开发语言,像GO语言虽然是属于最新出来编程语言但本身还不够稳定优点和缺点一样明显所以还得选择技术相对成熟的语言。还有在导航和定位的过程中需要不断的访问网络数据来获取当前位置和加载地图,所以随着我国第四代网络的出现已经完全能够满足手机定位APP的开发实现。 (1)开发平台操作系统:win7;开发工具:AndroidStudio、phtoshopcs6;开发包:百度地图SDK、jdk1.8.0;2.经济是否可行?Android开发者和工程师开发软件最终都是需要获得收益,所以在真正开发过程中也需要投入相应的资金才能保证效果,但是从百度地图开发的情况下来看SDK工具包可以直接到百度地图API网址上面在免费下载,开发人员也不需要很多。实际上在美工、UI布局、上线都是本人完成的。而且我也不需要盈利,因此从这两方面来说经济上面完全没有问题。3.法律可行?本课题设计的基于百度地图的手机定位APP,仅仅用于学习和做毕业设计。不做任何盈利用途,因此在法律上面没有任何问题,完全可行。3.2需求分析软件工程创建之前首先必须先进行需求分析,这样毕竟能够明确开发目的和方向还能够进行更加人性化科学的设计出来,有时候还能减小内存空间提升软件运行效率。否则,不仅开发的时候不太明确实际开发意图和方向。而且无法从使用者角度去考虑问题,不实用的功能只会给开发造成很大的负担和资源浪费。因此,在开发的过程中一定要充分考虑使用者的需求,不仅是在这次基于百度地图定位的APP开发所有的在Android系统上开发的app都要遵循和体现使用者基本的需求。通过分析用户的大致需求如下:可以根据当前城市名查询周边的地点,美食、酒店、学校、医院等;可以能够查看实时路况地图、城市热力地图、卫星地图等三种不同的使用模式;可以在滑动地图查找地点的之后点击当前按钮迅速回到当前位置;可以根据方向传感器的数据实时辨别当前方向,开启罗盘模式之后更加直观;可以通过长按设置目的地并且添加标识;可以进行模拟导航用来快速实时查看当前路况;可以开启实时导航地图会自动规划出最优线路,在驾车过程中计算车速和距离以及预计到达时间,最后完成导航。3.3地图系统运行的功能架构在实际工作过程中,经常需要介绍业务运行流程。而业务运行流程则由特定的图形和符号来表示地图系统运行的功能架构,不仅可以用来分析软件整理和接受结果的过程,还可以更加直观的发现其中不合理的流程。业务流程图标及功能架构如图3-1、图3-2所示:图3-1业务流程图标图3-2地图系统的功能架构图第4章百度Key(密钥)申请4.1申请百度密钥百度地图SDK是一套基于Android2.1及以上版本的应用程序设备接口。通过该接口开发者才能使用百度地图SDK的各项功能,并且使用无次数限制。在使用百度地图SDK的各项LBS功能之前,必须先获得百度地图的密钥。非营利项目可以直接使用。首先注册并登录百度账号,搜索并进入“百度地图API”官网。可以先选择“Android开发”了解一下也可以直接点击“申请密钥”。百度API如图4-1所示:图4-1百度API点击“创建应用”,并将“应用类型”改为“AndroidSDK”。然后获取SHA1值和包名。获取包名及SHA1值如图4-2、图4-3所示:图4-2获取包名图4-3获得SHA1值包名和SHA1值的具体获取步骤:包名直接在工程文件下面的“build.gradle”文件里面获取。第1步:运行进入控制台第2步:定位到.android文件夹下,输入cd.android第3步:输入keytool-list-v-keystoredebug.keystore,会得到三种指纹证书,选取SHA1类型的证书(密钥口令是android),例如:其中keytool为jdk自带工具;keystorefile为Android签名证书文件配置完成后点击“提交”,即可获得key(密钥)。获得密钥key如图4-4所示:图4-4获得密钥key4.2配置百度地图SDK工程环境在“project”目录下的libs目录下面放入下载好的baidumapapi_vX_X_X.jar包。在main文件夹下面新建“jniLibs”目录放入下载好的armeabi文件夹。添加jar包和so文件如图4-5所示:图4-5放入jar包和so文件然后更新正式将所有的baidumapap_vX_X_X.jar包。导入进工程,右键baidumapapi_vX_X_X.jar包。点击“AddAsLibrary”更新项目jar包如图4-6所示:图4-6导包更新工程最后需要查看jar包入工程的关系,并将需要的jar包加入工程,或者删除暂不需要的jar包。因为功能不同jar包也不同。4.2将Key添加到manifests文件application当中Android定位SDK4.2及之后版本需要在Mainfest.xml正确设置Accesskey(AK),如果设置错误将会导致定位和地理围栏服务无法正常使用。设置AK就是在Application标签中加入开发者申请的Key:<!--在application中添加开发密钥-->

<meta-data

android:name="com.baidu.lbsapi.API_KEY"

android:value="cckSXBHIsdQGVMwZ4m6ISFRdPuPZkn2p"/>第5章系统设计5.1系统功能结构根据百度地图的应用,是有开机闪屏页之后才正式跳转到地图页面(首次启动还会有开机引导页,由于图片太多容易造成内存泄漏并且也为了减少软件大小就舍弃了)。而地图页面作为前台让用户根据自己的需求来使用地图,能够进行周边查询。选择喜欢的使用模式、查看当前方向以及一些导航操作。为了充分考虑简洁性和方便性本人参考了下百度地图的页面设计,尽量看起来赏心悦目。地图根据功能在前台一一添加按钮,主要功能包括根据城市名和搜索类型来搜索周边地点;用户可以选择自己喜欢的使用模式:卫星地图、实况交通、城市热力图;用户可以在滑动地图查找地点之后通过定位按钮重新回到当前地图中心位置;启动方向罗盘来辨别方向;还调用了方向传感器来动态实时更新箭头位置方向十分灵敏;该系统还能够设置目的地来进行模拟导航和实时导航。系统功能架构如图5-1所示:图5-1系统功能结构图5.2申明软件应用权限Android定义了一种权限方案来保护设备上的资源和功能。例如,在默认情况下,应用程序无法访问联系人列表、拨打电话、发送短信等。下面就是本应用中需要用到和可能需要用到的权限。当我们不确定是否需要这个权限的时候尽量还是选择添加,毕竟不会影响软件的使用而且还能提高软件的兼容性。权限代码如下:<!--添加ShareSDK(分享)权限-->

<uses-permissionandroid:name="android.Permission.MANAGE_ACCOUNTS"/>

<uses-permissionandroid:name="android.Permission.GET_ACCOUNTS"/>

<!--蓝牙分享所需的权限-->

<uses-permissionandroid:name="android.Permission.BLUETOOTH"/>

<uses-permissionandroid:name="android.Permission.BLUETOOTH_ADMIN"/>

<!--这个权限用于进行网络定位-->

<uses-permissionandroid:name="android.Permission.ACCESS_COARSE_LOCATION"/>

<!--这个权限用于访问GPS定位-->

<uses-permissionandroid:name="android.Permission.ACCESS_FINE_LOCATION"/>

<!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->

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

<!--获取运营商信息,用于支持提供运营商信息相关的接口-->

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

<!--这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->

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

<!--用于读取手机当前的状态-->

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

<!--写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->

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

<!--访问网络,网络定位需要上网-->

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

<!--SD卡读取权限,用户写入离线定位数据-->

<uses-permissionandroid:name="android.Permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<uses-permissionandroid:name="com.android.launcher.permission.READ_SETTINGS"/>

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

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

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

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

<uses-permissionandroid:name="com.android.launcher.permission.READ_SETTINGS"/>

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

<!--SDK1.5需要android.permission.GET_TASKS权限判断本程序是否为当前运行的应用?-->

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

<uses-permissionandroid:name="android.Permission.BROADCAST_STICKY"/>

<!--来电消音-->

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

<uses-permissionandroid:name="android.Permission.MODIFY_AUDIO_SETTINGS"/>

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

<!--摄影机-->

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

<!--截图-->

<uses-permissionandroid:name="android.Permission.WRITE_EXTERNAL_STORAGE"/>5.3基本配置因为本应用是调用的百度SDK所以我们需要调用百度SDK的接口,而百度也因此为我们开发者提供了十分便捷的百度地图显示接口,通过以下几步我们就可以在应用中使用百度地图的所用数据了。Service(服务)[8]是能够在后台执行长时间运行操作并且不提供用户界面的应用程序组件。其他应用程序组件能启动服务,并且即便用户切换到另一个应用程序,服务还可以在后台运行。第一步,在application标签中声明service组件:<!--在application标签中声明service组件,每个app拥有自己单独的定位service-->

<service

android:name="com.Baidu.location.f"

android:enabled="true"

android:process=":remote"/>第二步,在布局xml文件中添加地图控件:<!--在布局xml文件中添加地图控件;-->

<com.baidu.mapapi.map.MapView

android:id="@+id/bmapView"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_alignParentTop="true"

android:clickable="true"/>第三步,创建地图的活动(Activity)管理地图生命周期://管理地图生命周期

@Override

protectedvoidonDestroy(){

super.onDestroy();

//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理

mMapView.onDestroy();

}

@Override

protectedvoidonResume(){

super.onResume();

//在activity执行onResume时执行mMapView.onResume(),实现地图生命周期管理

mMapView.onResume();

}

@Override

protectedvoidonPause(){

super.onPause();

//在activity执行onPause时执行mMapView.onPause(),实现地图生命周期管理

mMapView.onPause();

}第6章系统实现6.1系统运行环境和开发平台系统开发及运行环境和硬件信息如表1所示:表1系统开发及运行环境和硬件信息表硬件名称硬件详细信息CPUCore™i3.2.40GHz及以上配置内存4G及以上配置硬盘500G及以上配置显示器分辨率在1366×768像素及以上网络1M及以上操作系统Windows764位/32位开发工具AndroidStudio1.5、photoshopcs66.2系统开机闪屏页面采用Handler来实现跳转并设置3秒后启动地图页面。开机闪屏页如图6-1所示:关键代码如下://在注册事件方法中设置3秒后启动

handler.sendEmptyMessageDelayed(START_ACTIVITY,3000);//Handler实现跳转

privateandroid.os.Handlerhandler=newandroid.os.Handler(){

@Override

publicvoidhandleMessage(Messagemsg){

super.handleMessage(msg);

switch(msg.what){

caseSTART_ACTIVITY:

//从当前界面跳到要开启的界面startActivity(newIntent(SplashActivity.this,MapActivity.class));

}

}

};图6-1开机闪屏页6.3地图主界面这是开机完成后的地图主界面,打开地图之后。自动开启方向传感器和定位,同时打开罗盘俯瞰模式(3秒后退出到时会保持俯瞰)。在此页面用户可以搜索、定位、切换模式等需要的操作。地图主界面如图6-2所示:图6-2地图主界面6.3.1设置请求定位信息开启软件之后软件会自动定位到当前位置,当滑动地图之后也可以点击“我的”按钮,重新定位到当前位置并显示到地图中央。关键代码如下:

privateclassMyLocationListnerimplementsBDLocationListener{

@OverridepublicvoidonReceiveLocation(BDLocationlocation){//定位成功回调函数//mapview销毁后不再处理新的接收位置

if(location==null||mMapView==null)

return;

//构造定位数据MyLocationDatadata=newMyLocationData.Builder()//构造我的位置当前信息

.accuracy(location.getRadius())//设置精度

.latitude(location.getLatitude())//设置纬度

.longitude(location.getLongitude())//设置经度

.direction(mCureentX)//设置图标的方向值

.build();

mBaiduMap.setMyLocationData(data);//将位置信息转换为data数据

//设置定位图层定位图标

//COMPASS显示指南针导航标志FOLLOWING跟随态保持定位图标在地图中心

MyLocationConfigurationconfig=newMyLocationConfiguration

(mLocationMode,true,mIconLocation);

//调用定位图标

mBaiduMap.setMyLocationConfigeration(config);

mLocationMode=MyLocationConfiguration.LocationMode.NORMAL;

//每次定位成功之后更新数据

mLatitude=location.getLatitude();

mlongtitude=location.getLongitude();

//判断是否是第一次定位

if(isFirstIn){

//获取经纬度

LatLnglatLng=newLatLng(mLatitude,mlongtitude);MapStatusUpdatemsu=MapStatusUpdateFactory.newLatLng(latLng);

mBaiduMap.animateMapStatus(msu);//地图的位置使用动画效果转过去

mLastLocationData=latLng;//记录起点位置

isFirstIn=false;

//将位置报出来。

Toast.makeText(context,location.getAddrStr(),

Toast.LENGTH_SHORT).show();

}

}

}6.3.2 定位监听器/配置事件监听器地图应用需要进行初始设置以便能让用户打开软件之后就能获得比较好的体验,例如:国际经纬度坐标标准为WGS-84,国内必须至少使用国测局制定的GCJ-02,对地理位置进行首次加密。百度坐标在此基础上,进行了BD-09二次加密措施,更加保护了个人隐私。百度对外接口的坐标系并不是GPS采集的真实经纬度,需要通过坐标转换接口进行转换等。另外地图的精度也可以设置并可以通过设置定位请求时间,以及初始化方向传感器。关键代码如下:

privatevoidinitLocation(){

mLocationMode=MyLocationConfiguration.LocationMode.COMPASS;//模式切换

mLocationClient=newLocationClient(this);//声明定位监听器

myLocationListner=newMyLocationListner();//实例化定位监听器

mLocationClient.registerLocationListener(myLocationListner);//注册定位监听器

//配置事件监听器

LocationClientOptionoption=newLocationClientOption();//可选,默认高精度,设置定位模式,高精度

option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);

option.setCoorType("bd09ll");//定义地图坐标系

option.setIsNeedAddress(true);//返回的位置结果包含地址信息

option.setOpenGps(true);//开启GPS

option.setScanSpan(1000);//每隔1秒·请求定位一次

//option.setNeedDeviceDirect(true);//定位结果包含机头方向

mLocationClient.setLocOption(option);//必须设置否者无法监听

mLocationClient.start();//启动SDK定位

mLocationClient.requestLocation();//发送请求

//初始化定位图标

mIconLocation=BitmapDescriptorFactory.

fromResource(R.drawable.fangxiang);

//初始化方向传感器

mMyOrientationListener=newMyOrientationListener(this);

//回调方向传感器

mMyOrientationListener.setOnOrientationListener

(newMyOrientationListener.OnOrientationListener(){

@Override

publicvoidonOrientationChanged(floatx){

mCureentX=x;//接受新的X方位

}

});}6.3.3 最后需要设置开启和关闭定位定位开启之后当然需要能够关闭不能够一直定位,这样用户肯定是不能接受的,因此我们就需要既能够开启定位又能够关闭定位,以及方向传感器的开启和关闭。关键代码如下:定位完成之后需要退出所以(onstop,onstar)

@Override

protectedvoidonStart(){

super.onStart();

mBaiduMap.setMyLocationEnabled(true);//是否允许开启定位

//进行判断是否启动

if(!mLocationClient.isStarted())

mLocationClient.start();//开启定位

}

@Override

protectedvoidonStop(){

super.onStop();

mBaiduMap.setMyLocationEnabled(false);//不允许开启定位

mLocationClient.stop();

}6.3.4 方向传感器Android系统的一大亮点之一就是对传感器[9]的应用,利用传感器可以开发出很多新奇有趣的程序,小到水平仪、计步器,大到传感器游戏,这里是地图应用的方向传感器功能就是当转动手机的时候,地图上显示个人所在位置的图标的箭头变动,传感器随着定位的开始而开启,随着定位的结束而结束传感器获得位置的移动而更新方向。关键代码如下://开始监听

@SuppressWarnings("deprecation")

publicvoidstart(){

//通过传感器管理者拿到传感器

mSensorManager=(SensorManager)mContext

.getSystemService(Context.SENSOR_SERVICE);

//判断是否开启传感器管理者

if(mSensorManager!=null){

//获得方向传感器

mSensor=mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);

}

//判断传感器是否为空

if(mSensor!=null){

//设置感应精度.SENSOR_DELAY_GAME

mSensorManager.registerListener(this,mSensor,

SensorManager.SENSOR_DELAY_UI);

}

}

//结束监听

publicvoidstop(){

//移除监听停止定位

mSensorManager.unregisterListener(this);

}6.3.5 检测当方向发生改变时这里的思路是和指南针思路[10]是一样的:程序先准备一张指南针图片,该图片上方指针指向北方。然后检测和接收传感器在更新图层从而达到改变方向的效果。关键代码如下://判断返回传感器类型是否为方向传感器

if(event.sensor.getType()==Sensor.TYPE_ORIENTATION){

floatx=event.values[SensorManager.DATA_X];

//判断方向与最新的x进行比对从而做出改变

//只要偏差大于1.0就会通知主界面更新

if(Math.abs(x-lastX)>1.0){

if(mOnOrientationListener!=null)

{

mOnOrientationListener.onOrientationChenged(x);

}

}

lastX=x;//最后将新的x值传过来

}6.4实时路况界面这是地图实时路况界面,点击“路况”按钮之后就开始实时查看目前为止的路况信息,绿色表示此路段畅通、黄色表示此路段缓行、红色表示此路段拥堵如果为灰色则表示此路段无信息。实时路况界面如图6-3所示:图6-3实时路况界面关键代码如下(按钮单击事件部分):caseR.id.id_map_traffic://实时交通

//做一个判断如果当前已经是交通图,点击会关闭。否则打开交通图

if(mBaiduMap.isTrafficEnabled()){

mBaiduMap.setTrafficEnabled(false);

//.setTitle("实时交通(off)");}else{

mBaiduMap.setTrafficEnabled(true);

//item.setTitle("实时交通(on)");

}break;6.5视图界面这是视图模式界面,通过点击屏幕上的“卫星图标”可以查看2D平面图、3D俯瞰图。还可以根据需求切换为卫星图的2D、3D模式。6.5.1 卫星地图界面这是卫星地图界面,通过点击左边的“熊猫LOGO”按钮可以切换为普通地图模式。卫星界面如图6-4所示:图6-4卫星界面关键代码如下:caseR.id.id_map_site://卫星地图

mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);

break;6.5.2 城市热力图界面这是城市热力图通过点击“路况”按钮下的“热力切换图”按钮可以查看当前区域温度的情况再点击一次后即可恢复为普通模式。热力图界面如图6-5所示:图6-5热力图界面关键代码如下:caseR.id.id_map_heat://普通地图

//普通地图到热力切换

if(mBaiduMap.isBaiduHeatMapEnabled()){

mBaiduMap.setBaiduHeatMapEnabled(false);

}else{

mBaiduMap.setBaiduHeatMapEnabled(true);

}

break;6.6搜索界面这是地图的搜索及结果页面,通过选择城市名和搜索类型再点击“搜索”按钮就可以查找城市内搜索信息,同时还可以通过弹窗显示出来并在地图上添加“覆盖物”进行标注。搜索类型包括:美食、学校、酒店、医院、银行等。搜索界面及搜索结果弹窗界面和搜索结果标注界面如图6-6、图6-7和图6-8所示:图6-6搜索界面这是通过下拉列表的方式来存储城市名和搜索类型从而可以避免输入错误而导致软件崩溃的情况发生。关键代码如下://每次搜索前先前sb中的内容清空

sb=newStringBuilder();

//输入正确城市名和关键字

StringcityWord=spinner_city.getSelectedItem().toString();

StringkeyWord=spinner_keyword.getSelectedItem().toString();

//发起检索请求

poiSearch.searchInCity((newPoiCitySearchOption())

.city(cityWord)

.pageNum(10)

.keyword(keyWord));图6-7搜索结果弹窗界面当启动搜索之后,搜索结果的POI信息当然能够显示出来是最好的,所以我采用了弹窗的方式来显示搜索结果的POI信息,因为限制所以只能最多显示10条信息。关键代码如下://通过AlertDialog显示当前页搜索到的POI

newAlertDialog.Builder(MapActivity.this)

.setTitle("搜索到的POI信息")

.setMessage(sb.toString())

.setPositiveButton("关闭",newDialogInterface.OnClickListener(){

@Override

publicvoidonClick(DialogInterfacedialog,intwhich){

dialog.dismiss();

}}).create().show();图6-8搜索结果标注界面当获取到搜索结果的POI之后当然最好可以在地图上面标注出来,因此可以采用添加覆盖物的方式来进行标注,这里我采用的是红色位置图标。关键代码如下://poi实例化

poiSearch=PoiSearch.newInstance();

//创建POI检索的监听事件

OnGetPoiSearchResultListenerpoiListener=newOnGetPoiSearchResultListener(){

@Override

publicvoidonGetPoiResult(PoiResultpoiResult){

//获取POI检索结果

if(poiResult==null||poiResult.error==SearchResult.ERRORNO

.RESULT_NOT_FOUND){//没有检索到信息

Toast.makeText(MapActivity.this,"未找到结果",Toast.LENGTH_LONG).show();

return;

}else{

List<PoiInfo>poiInfolist=poiResult.getAllPoi();

//记录搜索到的POI数目

sb.append("共搜索到").append(poiResult.getTotalPageNum()).append("个POI\n");

//清除地图上上次已有的所有覆盖物

mBaiduMap.clear();

for(PoiInfop:poiInfolist){

System.out.println(p.address+"=="+p.city+"=="++"=="+p.phoneNum);

//添加POI检索位置覆盖物

BitmapDescriptorbd=BitmapDescriptorFactory

.fromResource(R.drawable.icon_gcoding);

//构建MakerOption,用于在地图上添加覆盖物图标(p.loction来设置经纬度)

OverlayOptionsoptions=newMarkerOptions().position(p.location).icon(bd);

//在地图上添加进来

mBaiduMap.addOverlay(options);

//添加每次搜索到POI信息的名称

sb.append("名称:").append().append("\n");

}

//通过AlertDialog显示当前页搜索到的POI

newAlertDialog.Builder(MapActivity.this)

.setTitle("搜索到的POI信息")

.setMessage(sb.toString())

.setPositiveButton("关闭",newDialogInterface.OnClickListener(){

@Override

publicvoidonClick(DialogInterfacedialog,intwhich){

dialog.dismiss();

}

}).create().show();

}

}

@Override

publicvoidonGetPoiDetailResult(PoiDetailResultpoiDetailResult){

//获取Place详情页检索结果

}

@Override

publicvoidonGetPoiIndoorResult(PoiIndoorResultpoiIndoorResult){

}

};

//设置POI检索监听者

poiSearch.setOnGetPoiSearchResultListener(poiListener);6.7导航界面这是导航界面通过长按地图来设置目的地同时会用覆盖物标注出来,通过设置目的地再点击:“模拟”和“实时”按钮即可实施相应的导航功能。适用于车载导航。6.7.1 通过长按地图设置目的地,并添加标识。设置目的地界面如图6-9所示:图6-9设置目的地界面当用户需要导航的时候,可以通过长按地图上面的目的地来进行设置。并且软件会将用户的目的地通过添加终点覆盖物“图标”的方式标识出来。关键代码如下://设置地图的长按事件

mBaiduMap.setOnMapLongClickListener(newBaiduMap.OnMapLongClickListener(){

@Override

publicvoidonMapLongClick(LatLnglg){

Toast.makeText(MapActivity.this,"设置目的地成功",Toast.LENGTH_SHORT).show();

mDestLocationData=lg;

addDestInfoOverlay(lg);//设置调用事件

}

});//长按事件方法

privatevoidaddDestInfoOverlay(LatLngdestInfo){

mBaiduMap.clear();//清楚所有的overlay

OverlayOptionsoptions=newMarkerOptions().position(destInfo)

.icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_en))

.zIndex(5);//传入图片

mBaiduMap.addOverlay(options);}6.7.2 模拟、实时导航界面这是模拟导航界面,通过点击“模拟导航”按钮用户可以进行路线的全程模拟从而更加详细了解规划路线的目前为止(当前)的路况信息。模拟导航界面如图6-10所示:图6-10模拟导航界面因为用户设置目的地之后肯定也不太清楚当前自驾车路线的实际路况情况,所以这里提供了一个模拟导航功能,可以让用户提前了解到路线的路况信息(多少个弯道、红绿灯等)。提前来熟悉道路情况。关键代码如下://判断当前导航是否可用

privatebooleaninitDirs(){

mSDCardPath=getSdcardDir();//调用判断当前导航是否可用的具体方法

if(mSDCardPath==null){

returnfalse;

}Filef=newFile(mSDCardPath,APP_FOLDER_NAME);//给导航主目录建立名字

if(!f.exists()){

try{

f.mkdirs();//+s是防止出现些问题

}catch(Exceptione){

e.printStackTrace();

returnfalse;

}

}

returntrue;

}

Stringauthinfo=null;/**

*内部TTS播报状态回传handler

*/

privateHandlerttsHandler=newHandler(){

publicvoidhandleMessage(Messagemsg){

inttype=msg.what;

switch(type){

caseBaiduNaviManager.TTSPlayMsgType.PLAY_START_MSG:{

//showToastMsg("Handler:TTSplaystart");

break;

}

caseBaiduNaviManager.TTSPlayMsgType.PLAY_END_MSG:{

//showToastMsg("Handler:TTSplayend");

break;

}

default:

break;

}

}

};

/**

*内部TTS播报状态回调接口

*/

privateBaiduNaviManager.TTSPlayStateListenerttsPlayStateListener=newBaiduNaviManager.TTSPlayStateListener(){

@Override

publicvoidplayEnd(){

//showToastMsg("TTSPlayStateListener:TTSplayen");

}

@Override

publicvoidplayStart(){

//showToastMsg("TTSPlayStateListener:TTSplaystart");

}

};

publicvoidshowToastMsg(finalStringmsg){

MapActivity.this.runOnUiThread(newRunnable(){

@Override

publicvoidrun(){

Toast.makeText(MapActivity.this,msg,Toast.LENGTH_SHORT).show();

}

});

}

//初始化导航.校验KEY和导航引擎

privatevoid

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论