Android平台GPS系统的应用开发

第一部分、前述:

Android作为Google移动互联网战略的重要组成部分,将进一步推进“随时随地为每个人提供信息”这一企业目标的实现。Google的目标是让移动通信不依赖于设备,甚至是平台。出于这个目的,Android将完善而不是替代Google长期以来推行的移动发展战略:通过与全球各地的手机制造商和移动运营商成为合作伙伴,开发既实用又有吸引力的移动服务,并推广这些产品。

随着城市化的进展和家用轿车的普及.原本根遥远的全球卫星定位系统(Global Position System.6Ps)的使用越来越多,但车挪导航仪高昂的价格和每次地图数据痒升级所需的费用.导致车载GPS导航产品仍旧没有非常普及。而且适用于在个人徒步行走的GPS实时导航产品还非常少。

GPS导航系统是集中应用了自动定位技木、地理信息系统(简称GI S)与数据库技木、计算机技术、无线通信技术的高科技综含系统。依据车载导航系统把车辆和道路综合起来考虑.运用各种高新技术系统可以有效解决交通问题。目前随着智能手机的普及.如何在智能手机中开发GPS导航系统可以说是目前的一个热点问题。

第二部分、体系结构:

1、Android SDK架构

Android平台由操作系统、中间件、用户界面和应用软件组成。它采用软件堆层的架构,主要分为三部分。底层以Linux内核工作为基础,由C语言开发,只提供基本功能;中间层包括函数库Library和虚拟机Virtual Machine,由C++开发。最上层是各种应用软件,包括通话程序,短信程序等,应用软件则由各公司自行开发,以Java作为编写程序的一部分。

      第一层,应用程序层,该层提供一些核心应用程序包,例如电子邮件、短信、日历、地图、浏览器和联系人管理等。同时,开发者可以利用Java语言设计和编写属于自己的应用程序,而这些程序与那些核心应用程序彼此平等、友好共处。

     第二层,应用程序框架层,该层是Android应用开发的基础,开发人员大部分情况是在和它打交道。应用程序框架层包括活动管理器、窗口管理器、内容提供者、视图系统、包管理器、电话管理器、资源管理器、位置管理器、通知管理器和XMPP服务十个部分。

     第三层,系统库和Android运行时,系统库包括九个子系统,分别是图层管理、媒体库、SQLite、OpenGLEState、FreeType、WebKit、SGL、SSL和libc。Android运行时包括核心库和Dalvik虚拟机,前者既兼容了大多数Java语言所需要调用的功能函数,又包括了Android的核心库,比如android.os、android.net、android.media等等。后者是一种基于寄存器的java虚拟机,Dalvik虚拟机主要是完成对生命周期的管理、堆栈的管理、线程的管理、安全和异常的管理以及垃圾回收等重要功能。

     第四层,Linux内核,Android核心系统服务依赖于Linux2.6内核,如安全性、内存管理、进程管理、网络协议栈和驱动模型。Linux内核也是作为硬件与软件栈的抽象层。驱动:显示驱动、摄像头驱动、键盘驱动、WiFi驱动、Audio驱动、flash内存驱动、Binder(IPC)驱动、电源管理等。

2、开发环境

操作系统:Microsoft Windows 7

IDE: Ecplise  Latefrom Version 3.3.1.1

开发包:Android SDK

模拟机:Android2.1或Android2.3等

第三部分、需求分析

1、GPS导航应用系统设计规划

本设计的实现思路是在智能手机上开发一个GPS应用程序,运行该程序后,在其主界面上可以创建一个新的跟踪,然辰在后台启动一个Service,定时读取GPS数据获得用户目前所在的位置信息,将其存入数据库中,用户可以选择以往的跟踪记录,将其轨迹显示在蚍.由此可以记录用户去过的位置。

基于上面的思路,基于Android的GPS导航应用开发的框图如图1所示:在智能手机的硬件平台上,基于android手机操作系统来开发GPS导航应用。我们可以把这个GPS应用开发分为如下步骤: (1)规划应用UI。(2)设计储存,创建数据库、表。(3)实现页面Active的跳转。(4)实现服务Service。(5)完善和实现程序。(6)程序打包、签名并发布。

2、性能

(1)由于项目调用android camera api,所以需要在androidmanifest.xml中写入开启调用camera api权限的代码,否则项目会因权限不够而无法运行调用camera api的代码

(2)项目调用 camera 后显现的取景,受真实手机的摄像头像素数等指标的影响,因此不同的手机运行本项目后取景图像可能质量不一样。

(3)项目本身是eclipse环境下的android项目,需要在已经添加了android插件的eclipse中以工程文件形式打开。

3、可靠性与可用性

本项目在motorola defy+ 手机上测试可以正常运行,因此在android2.1或更高版本的android真实手机上均可运行;在模拟机方面,系统版本为 android2.1或者更高的版本并保证系统剩余内存为1M的模拟机上都可正常运行。

第四部分、系统实现                                

Android在GPS导航系统软件设计过程中,主要利用了Android软件平台的5大功能模块,分别为Android应用程序层、应用框架层、普通函数程序库、Android:运行环境和Linux内核层。在应用程序层利用Android的各种组件API接口,开发了针对GPS导航的GPS、Ca)ogle Map电子地图的Java应用程序,并由内核层提供了相应的底层驱动。

首先我们建立项目,在Eclipse中依次选择File—New-'*Android Project项,输入项目名称和其他的辅助信息。下面我们具体进行GPS导航应用的开发。

1、项目各界面实现

手机屏幕中的一个界面就是一个Activity.所以Activity可以算是Android当中最基本的模块之一,一个Android应用程序我们可以认为就是由多个Activity的交互组成的,这多个Activity之间可以进行相互跳转。不同的Activity实现不同的功能。

GPS导航应用的界面主要有主界面,地图定位界面,新建跟踪界面,个性化设置界面以及帮助界面等。主界面的目标是展示一个“以往跟踪的列表”,下面以实现主界面为例进行设计。

<?xml vers ion=”1.0’encoding=”utf-8’?>
android:orientation=’vertical’
android:layout width=”fill parent”
android:layout—height=”fill一patent”
> 
<TextView ⋯⋯/>
<ListView⋯⋯/>
</LinearLayout>

在Android中生成屏幕界面主要使用的是跨平台的扩展标记描述性语言xml进行配置生成的方式,在main。ml使用了LinearLayout命令进行布局(采用了垂直方式),放置一个TextView和一个ListView组件,其目的用来显示最近跟踪的列表。对于布局,使用了”fill parent”>,因此在宽度和高度方向,都是填充满父容器。

使用MapView:

要让地图显示的话,我们得将MapView加入到应用中来,让我们在布局文件(main.xml)中加入如下代码:

<com.google.android.maps.MapView
android:id=”@+id/myGMap”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:enabled=”true”
android:clickable=”true”
android:apiKey=”API_Key_String” />

2 、GPS定位功能实现

Android操作系统支持GPS API,可以这样设置Criteria对象:Criteriac=new Criteria();创建一个Criteria对象,接着将Criteria对象传递给LocationManager对象,LocationManager对象提供了多种方式来获取经纬度坐标和其它数据,它获取定位数据的方法如下:对于经纬度,getLatitude()返回纬度数据,getLongitude()返同经度数据:对于海拔高度,hasAltitude()判断是否有海拔数据,而getAltitude0则以米为单位返回海拔数据。

Android 支持地理定位服务的API。该地理定位服务可以用来获取当前设备的地理位置。应用程序可以定时请求更新设备当前的地理定位信息。应用程序也可以借助一个 Intent接收器来实现如下功能:以经纬度和半径划定的一个区域,当设备出入该区域时,可以发出提醒信息。

让我们来看下android.location包下一些比较重要的功能类,以下是几个Android关于定位功能的包中比较重要的类:

LocationManager: 本类提供访问定位服务的功能,也提供 获取最佳定位提供者的功能。另外,临近警报功能 (前面所说的那种功能)也可以借助该类来实现。

LocationProvider: 该类是定位提供者的抽象类。定位提供者具备周期性报告设备地理位置的功能。

LocationListener: 提供定位信息发生改变时的回调功能。必须事先在定位管理器中注册监听器对象。

Criteria:该类使得应用能够通过在LocationProvider中设置的属性来选择合适的定位提供者。

Android也提供了一组访问 Google MAP的API,借助Google MAP及定位API,我们就能在地图上显示用户当前的地理位置:

Android中定义了一个名为com.google.android.maps的包,其中包含了一系列用于在Google Map上显示,控制和层叠信息的功能类,以下是该包中最重要的几个类:

MapActivity: 这个类是用于显示Google MAP的Activity类,它需要连接底层网络。

MapView: MapView是用于显示地图的View组件。它必须和MapActivity配合使用。

MapController : MapController用于控制地图的移动。

Overlay:这是一个可显示于地图之上的可绘制的对象。

GeoPoint: 这个一个包含经纬度位置的对象。

下面让我们来实际使用它们:

我们将来开发一个应用,它将能在Google Map上显示用户当前的位置。我们会通过使用Google Map API来显示地图,然后使用定位API来获取设备的当前定位信息以在Google Map上设置设备的当前位置。用户定位会随着用户的位置移动而发生改变。

Activity:

首先我们需要一个继承了MapActivity的Activity类:

class MyGPSActivity extends MapActivity {
 …
}

要成功引用Google MAP API,我们必须先在AndroidManifest.xml中定义如下信息:

<uses-library android:name=”com.google.android.maps” />

另外,要使用Google Map服务的话,我们需要一个API key。我们可以 通过如下方式获取API key:

1) 找到USER_HOME\Local Settings\Application Data\Android目录下的debug.keystore文件。

2) 使用keytool工具来生成认证信息(MD5),使用如下命令行:

keytool -list -alias androiddebugkey -keystore <path_to_debug_keystore>.keystore -storepass

android -keypass android

3) 打开 “Sign Up for the Android Maps API”页面,输入之前生成的认证信息(MD5) 后将获取到你的API key。

4) 替换上面AndroidManifest.xml配置文件中“API_Key_String”为你刚才获取的API key。

让我们来继续补全MyGPSActivity类的代码,以使用MapView:

class MyGPSActivity extends MapActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
//创建并初始化地图
gMapView = (MapView) findViewById(R.id.myGMap);
GeoPoint p = new GeoPoint((int) (lat * 1000000), (int) (long * 1000000));
gMapView.setSatellite(true);
mc = gMapView.getController();
mc.setCenter(p);
mc.setZoom(14);
} }

另外,要使用定位信息的话,必须设置一些权限,AndroidManifest.xml中的配置如下:

<uses-permission android:name=”android.permission.INTERNET”></uses-permission>
<uses-permission android:name=”android.permission.ACCESS_COARSE_LOCATION”></uses-permission>
<uses-permission android:name=”android.permission.ACCESS_FINE_LOCATION”></uses-permission>

使用定位管理器:

我们可以通过Context.getSystemService方法并传入Context.LOCATION_SERVICE参数获取定位管理器的实例:

LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

之后,我们需要将我们原先的MyGPSActivity作一些修改,让它实现一个LocationListener接口,使其能够监听定位信息的改变:

class MyGPSActivity extends MapActivity implements LocationListener {
public void onLocationChanged(Location location) {}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extras) {}
 protected boolean isRouteDisplayed() {
       return false;
   }
}

让我们来添加一些代码,对LocationManager进行一些初始化工作,并在它的onCreate()方法中注册定位监听器。

@Override
public void onCreate(Bundle savedInstanceState) {
LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 500.0f, this);
}

现在的代码中的onLocationChanged方法就会在用户的位置发生500米距离的改变之后进行调用。这里默认使用的 LocationProvider是“gps” (GSP_PROVIDER) ,不过你可以根据你的需要,使用特定的Criteria对象调用LocationManger类的getBestProvider方法获取其他的 LocationProvider。以下代码是onLocationChanged方法的参考实现:

public void onLocationChanged(Location location) {
   if (location != null) {
    double lat = location.getLatitude();
    double lng = location.getLongitude();
    p = new GeoPoint((int) lat * 1000000, (int) lng * 1000000);
    mc.animateTo(p);
    }
}

上面的代码用于获取当前的新位置并更新地图上的位置显示。

我们还可以为应用程序添加一些诸如缩放效果,地图标注,文本等功能。

添加缩放控件:

// 将缩放控件添加到地图上
ZoomControls zoomControls =  (ZoomControls) gMapView.getZoomControls();
 zoomControls.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
gMapView.addView(zoomControls);
gMapView.displayZoomControls(true);

添加Map Overlay:

下面的代码是定义一个overlay:

class MyLocationOverlay extends com.google.android.maps.Overlay {
@Override
public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) {
super.draw(canvas, mapView, shadow);
Paint paint = new Paint();
// 将经纬度转换成实际屏幕坐标
Point myScreenCoords = new Point();                  mapView.getProjection().toPixels(p, myScreenCoords);
paint.setStrokeWidth(1);
paint.setARGB(255, 255, 255, 255);
paint.setStyle(Paint.Style.STROKE);
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.marker);
canvas.drawBitmap(bmp, myScreenCoords.x, myScreenCoords.y, paint);
canvas.drawText(”Here I am…”, myScreenCoords.x, myScreenCoords.y, paint);
    return true;
  }
}

上面的这个overlay会在地图上显示一个“Here I am”的文本。

让我们把这个overlay添加到地图上去:

MyLocationOverlay myLocationOverlay = new MyLocationOverlay();
List<Overlay> list = gMapView.getOverlays();
list.add(myLocationOverlay);

3、 Google MAP电子地图显示处理

利用Android平台开发导航地图过程中,主要采用Android提供的MapView和MapActivity这两个类实现。其中MapView是一个展示地图的视图,它可以获取键盘事件(onKeyDown和onKeyUp)来支持地图移动和缩放功能,同时也支持多层Overlay,可在地图上画坐标、写地名、画图片等。MapView只能通过MapActivity来建立,因为MapView需要在后台使用文件系统和网络,所有这些线程需要在Activity的生命周期中被控制。

第五部分、总结

利用android操作系统在智能予机上实现了GPS导航的应用开发,利用终端各功能模块的整合,配合相应的软件驱动,完成指定的功能,如对定位信息进行数据处理,计算所在位置的经度,纬度,海拔,速度和时间等,并实时将定位的参数传输到服务器管理平台,方便管理人员对相关车辆进行实时监控与调度,提高T作效率和运营效益。因为GPS系统具有全天候、全球覆盖、三维定速、定时、高精度、快速、省时、高效率、应用广泛、多功能等特点,因此,可广泛应用子陆地、海洋以及航空航天等。而能实时更新的Google Map地图的使用,更能直观地将丰富的城市地图、全国的公路网图、加油站、便利商店、政府机关、旅游景点、餐馆、医院、停车场等信息同步地在智能手机卜显示出来,方便使用者(不仅仅是汽车驾驶员)进行查询参考,这是以后Android个性化应用开发,这将是一个潜力巨大的市场,会吸引无数软件开发厂商和开发者投身其中。

参考资料

《Android应用开发揭秘》 杨丰盛   机械工业出版社

《Google Android揭秘》  W.Frank Ableson   Charlie Collins  Robi Sen   人民邮电出版社

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏无原型不设计

给你灵感的23个优秀线框原型图示例

如何在产品初始阶段以最快的方式展示设计思路?我想大多数的UX/UI设计人员都会倾向于快速构建一个线框原型图。这的确是一个非常明智的选择。那么问题来了,设计师如何...

3416
来自专栏互联网杂技

我用爬虫一天时间“偷了”知乎一百万用户,只为证明PHP是世界上最好的语言

看了不少朋友圈里推荐的Python爬虫文章,都觉得太小儿科,处理内容本来就是PHP的强项,Python唯一的好处估计也就天生的Linux自带,和Perl一样,这...

3487
来自专栏腾讯安全应急响应中心

四两拨千斤 —— Ubuntu kernel eBPF 0day分析

 中国武术博大精深,其中太极作为不以拙力胜人的功夫备受推崇。同样如果从攻击的角度窥视漏洞领域,也不难看出攻防之间的博弈不乏“太极”的身影,轻巧稳定易利用的漏洞与...

1264
来自专栏BestSDK

腾讯地图开放H5定位API,率先支持iOS10

苹果的iOS 10已经正式对外推送,相信尝鲜的用户已经更新到最新的系统。然而,如果web站没有及时支持https协议的话,当很多用户在iOS 10下访问很多网站...

3318
来自专栏机器人网

机器人系统组成基础知识大全,作为机器人工程师更要熟读此文!

一.机器人简单介绍 1、机器人的构成 是由伺服电机驱动的机械机构组成的,各环节每一个结合处是一个关节点或坐标系。 ? 2、机器人的用途 Arc weld...

3337
来自专栏自然语言处理

微博话题爬取与存储分析(上)

本文基于python以新浪微博为数据平台,从数据采集、关键字提取、数据存储三个角度,用最简单的策略来挖掘我们的“黄金”。

992
来自专栏Python爬虫与算法进阶

基于Scrapy的全球最大成人网站PornHub爬虫

首先科普下 PornHub 是个啥? Pornhub是一个加拿大的色情影片分享网站。它是目前网上最大的色情影片网站,服务分享遍及全球。Pornhub于2007年...

8906
来自专栏极乐技术社区

小程序音频API踩坑手册

1753
来自专栏.NET技术

MVC系列之开始

   4月5号晚本来应该写出来的,这几天迷上了炉石传说,打得有点疯,明天又得上班了,收拾心情还是得写出来。上星期5晚上回家的时候,不得不吐槽一下的确有点背。6点...

562
来自专栏何俊林

kotlin写的音视频app(已开源)

目前项目持续更新重构中(目前项目已经转型到kotlin了) Life is a Multimedia information app based on Mate...

2029

扫描关注云+社区