Android编程之实现GPS定位

移动开发 Android
本文帮助读者理解如何使用Android SDK来开发Android程序,其中包括如何使用XML布局来显示,从GPS组件中获得设备的位置等,在本文的最后将学习如何将文本显示在一个定制的视图上。

一、准备工作
要想开发Android程序,我们需要如下三种软件:
1. Eclipse
2. Android SDK
3. 开发Android程序的Eclipse 插件

为了开始我们的工作,首先要安装Eclipse,然后从Google的网站获得Android SDK,并且安装Eclipse插件。

二、Activity类
每一种移动开发环境都有自己的基类。如J2ME应用程序的基类是midlets,BREW的基类是applets,而Android程序的基类是 Activity。这个activity为我们提供了对移动操作系统的基本功能和事件的访问。这个类包含了基本的构造方法,键盘处理,挂起来恢复功能,以 及其他底层的手持设备的访问。实质上,我们的应用程序将是一个Activity类的扩展。在本文中读者将会通过例子学习到如何使用Activity类来编 写Android程序。下面是一个简单的继承Activity的例子。

  1. public class LocateMe extends Activity{  
  2. public void onCreate(Bundle params){  
  3.       super.onCreate(params);  
  4.       setContentView(R.layout.main);  
  5.      }  
  6. public boolean onKeyDown(int keyCode, KeyEvent event){  
  7.         return true;  
  8.           }  
  9.   }  

三 View类
View类是Android的一个超类,这个类几乎包含了所有的屏幕类型。但它们之间有一些不同。每一个view都有一个用于绘画的画布。这个画布可以用 来进行任意扩展。本文为了方便起见,只涉及到了两个主要的View类型:定义View和Android的XML内容View。在上面的代码中,使用的是 “Hello World” XML View,它是以非常自然的方式开始的。
如果我们查看一下新的Android工程,就会发现一个叫main.xml的文件。在这个文件中,通过一个简单的XML文件,描述了一个屏幕的布局。这个 简单的xml文件的内容如下:

 

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3. androidrientation="vertical" 
  4. android:layout_width="fill_parent" 
  5. android:layout_height="fill_parent" 
  6. > 
  7. <TextView 
  8. android:layout_width="fill_parent" 
  9. android:layout_height="wrap_content" 
  10. android:layout_centerHoriz  
  11. android:text="ress the center key to locate yourself" 
  12. /> 
  13. </RelativeLayout> 

上面的内容的功能看起来非常明显。这个特殊文件定义了一个相关的布局,这就意味着通过一个元素到另一个元素的关系或是它们父元素的关系来描述。对于视图来 说,有一些用于布局的方法,但是在本文中只关注于上述的xml文件。
RealtiveLayout中包含了一个填充整个屏幕的文本框(也就是我们的LocateMe activity)。这个LocateMe activity在默认情况下是全屏的,因此,文本框将继承这个属性,并且文本框将在屏幕的左上角显示。另外,必须为这个XML文件设置一个引用数,以便 Android可以在源代码中找到它。在默认情况下,这些引用数被保存在R.java中,代码如下:

  1. public final class R{  
  2. public static final class layout{  
  3. public static final int main=0x7f030001;  
  4.    }  
  5. }  

视图也可以被嵌套,但和J2ME不同,我们可以将定制的视图和Android团队发布的Widgets一起使用。在J2ME中,开发人员被迫选择 GameCanvas和J2ME应用程序画布。这就意味着如果我们想要一个定制的效果,就必须在GameCanvas上重新设计我们所有的widget。 Android还不仅仅是这些,视图类型也可以混合使用。Android还带了一个 widget库,这个类库包括了滚动条,文本实体,进度条以及其他很多控件。这些标准的widget可以被重载或被按着我们的习惯定制。现在让我们来进入 我们的例子。 

#p#

四、Android实例

这个演示应用程序将演示了用户的当前的经度和纬度(在文本框中显示)。onCreate构造方法将和上面的例子基本相同,除了在其中加入了键盘处理,现在 让我们看一下onKeyDown的代码。

  1. public boolean onKeyDown(int keyCode, KeyEvent event){  
  2. if(keyCode != KeyEvent.KEYCODE_DPAD_CENTER || m_bLoading)  
  3. {  
  4. return true;  
  5. }  
  6. m_bLoading = true;  
  7. getLocation();  
  8. return true;  

下面让我们来解释一下这段代码,首先,这段代码检查了当前被按下的键,但还没有开始处理。而是在getLocation方法中处理这一切的。然后,将装载 flag标志以及调用getLocation方法,下面是getLocation方法的代码。

  1. private void getLocation(){  
  2. Location loc;  
  3. LocationManager locMan;  
  4. LocationProvider locPro;  
  5. List<LocationProvider> proList;  
  6. setContentView(R.layout.laoding);  
  7. locMan = (LocationManager) getSystemService(LOCATION_SERVICE);  
  8. proList = locMan.getProviders();  
  9. locPro = proList.get(0);  
  10. loc = locMan.getCurrentLocation(locPro.getName());  
  11. Lat = (float)loc.getLatitude();  
  12. Lon = (float)loc.getLongitude();  
  13. CreateView();  
  14. setContentView(customView);  

到这为止,程序开始变得更有趣了。但是不幸的是,Google关于之方面的文档还是比较少了。在程序的变量声明之后,我们需要演示一些装载信息。 R.layout.loading符合了另一个简单的XML布局视图。通过简单地调用setContentView方法可以使用转载信息重绘屏幕。
读者要注意的是:在编译时,Android会预先将所有的XML布局数据包装起来。如果我们想在编译后变化布局属性,按着规定,我们必须在源程序中做这些 事。
获得LocationManager的唯一方法是通过getSystemService()方法的调用。通过使用LocationManager, 我们可以获得一个位置提供者的列表。在一个真实的手持设备中,这个列表包含了一些GPS服务。实际上,我们希望选择更强大,更精确,最后不带有其他附加服 务的GPS。现在,在模拟器中提供了一个用于测试的GPS,这个GPS来自San Francisco。定制的GPS文件可以可以被上传,并进行测试。如果我们要测试更复杂的应用,来自San Francisco的GPS可能并不适合。
目前我们可以使用位置管理器和位置提供者进行getCurrentLocation的调用。这个方法返回本机的当前位置的一个快照,这个快照将以 Location对象形式提供。在手持设备中,我们可以获得当前位置的经度和纬度。现在,使用这个虚拟的手持设备,我们可以获得这个例子程序的最终结果: 建立了显示一个定制的视图。

五、使用定制视图
在最简单的窗体中,一个Android中的视图仅仅需要重载一个onDraw方法。定制视图可以是复杂的3D实现或是非常简单的文本形式。下面的 CreateView方法列出了上面看到的内容。

  1. public void CreateView(){  
  2. customView = new CustomView(this);  

这个方法简单地调用了CustomView对象的构造方法。CustomView类的定义如下:

  1. public class CustomView extends View{  
  2.      LocateMe overlord;  
  3. public CustomView(LocateMe pCtx){  
  4.      super(pCtx);  
  5.      overlord = pCtx;  
  6. }  
  7. public void onDraw(Canvas cvs){  
  8.    Paint p = new Paint();  
  9.    String sLat = "Latitude: " + overlord.getLat();  
  10.    String sLon = "Longitude: " + overlord.getLon();  
  11.    cvs.drawText(sLat , 32, 32, p);  
  12.    cvs.drawText(sLon, 32, 44, p);  
  13. }  

这个定制的Android视图获得了经度和违度的测试数据,并将这些数据显示在屏幕上。这要求一个指向LocateMe的指针,Activity类是整 个应用程序的核心。它的两个方法是构造方法和onDraw方法。这个构造方法调用了超类的构造方法以及引起了Activity指针的中断。onDraw方 法将建立一个新的Paint对象(这个对象封装了颜色、透明度以及其他的主题信息),这个对象将会访问颜色主题。在本程序中,安装了用于显示的字符串,并 使用画布指针将它们画到屏幕上。这个和我们了解的J2ME游戏的画布看起来非常类似。

六、Android展望
从纯粹的开发观点看,Android是一个非常强大的SDK。它使用基于XML的布局和定制视图联合了起来。并可以使用滚动条、地图以及其他的组件。所以 的这一切都可以被重载,或由开发人员来定制。但它所提供的文档非常粗糙。在文档中并没有象SMS等技术,但是从整体上来看Android SDK,还是非常有希望的。也非常符合Google承诺的“First Look”SDK。现在我们要做的就是等待Google发布第一个基于Android的手机,并使用它。
 

【编辑推荐】

Android智能手机操作系统

Android编程之实现GPS定位

Android开发中插入新的Activity

 编程人员怎样才能写出美丽的代码                                                                                                                                                                                                                     
 

责任编辑:zhaolei 来源: 博客园
相关推荐

2009-07-27 14:29:31

ASP.NET编程弹窗报警提示

2014-11-13 14:07:04

2013-03-29 10:47:39

Android获取经纬AndroidGPS定

2017-02-07 18:34:16

Linux编程PING

2011-07-18 13:37:53

2021-01-01 19:02:08

GPS定位欺骗网络安全

2017-09-01 13:41:20

Android定位服务

2011-05-24 09:23:00

中电信定位云

2011-08-23 17:33:00

SQLAndroid

2011-05-23 10:06:15

2020-08-06 11:20:49

数据泄露NSA位置数据

2012-10-29 13:25:54

JavaScriptJSjQuery

2015-04-24 09:48:59

TCPsocketsocket编程

2014-12-31 17:42:47

LBSAndroid地图

2022-02-14 15:07:48

进程FileChanne线程

2011-07-21 10:17:53

java

2009-06-30 10:05:24

MD5加密JSP源码

2014-07-17 14:51:52

2023-04-26 00:15:32

python面向对象java

2020-12-04 19:28:53

CountDownLaPhaserCyclicBarri
点赞
收藏

51CTO技术栈公众号