Android GPS定位详解及实例代码

GPS定位是智能手机上一个比较有意思的功能,LBS等服务都有效的利用了GPS定位功能。本文就跟大家分享下Android开发中的GPS定位知识。

     一、Android基础知识准备

1、Activity类

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

Java代码

public class LocateMe extends Activity
{
 public void onCreate(Bundle params)
 {
  super.onCreate(params);
  setContentView(R.layout.main);
 }  

 public boolean onKeyDown(int keyCode, KeyEvent event)
 {
  return true;
 }
}

在上面程序中的onCreate方法将在应用程序第一次开始时调用。Bundle对象包含了任何用于建立参数或环境数据所需要的基本信息。Activity 可以是全屏的,或是悬浮的。它们可以是嵌套的,但是每一部分基本是独立的。那么,也许有人会问,setContentView是做什么的呢?

       2、View类

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

XML/HTML代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="Press the center key to locate yourself"
/>
</RelativeLayout>

上面的内容的功能看起来非常明显。这个特殊文件定义了一个相关的布局,这就意味着通过一个元素到另一个元素的关系或是它们父元素的关系来描述。对于视图来说,有一些用于布局的方法,但是在本文中只关注于上述的xml文件。

RealtiveLayout中包含了一个填充整个屏幕的文本框(也就是我们的LocateMe activity)。这个LocateMe activity在默认情况下是全屏的,因此,文本框将继承这个属性,并且文本框将在屏幕的左上角显示。另外,必须为这个XML文件设置一个引用数,以便 Android可以在源代码中找到它。在默认情况下,这些引用数被保存在R.java中,代码如下:

Java代码

public final class R
{
 public static final class layout
 {
  public static final int main=0x7f030001;
 }
}

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

       二、Android GPS定位实例

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

Java代码

public boolean onKeyDown(int keyCode, KeyEvent event)
{
 if(keyCode != KeyEvent.KEYCODE_DPAD_CENTER || m_bLoading)
 {
  return true;
 }
 m_bLoading = true;
 getLocation();
 return true;
}

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

Java代码

private void getLocation()
{
  Location loc;
  LocationManager locMan;
  LocationProvider locPro;
  List<LocationProvider> proList;
  setContentView(R.layout.laoding);
  locMan = (LocationManager) getSystemService(LOCATION_SERVICE);
  proList = locMan.getProviders();
  locPro = proList.get(0);
  loc = locMan.getCurrentLocation(locPro.getName());
  Lat = (float)loc.getLatitude();
  Lon = (float)loc.getLongitude();
  CreateView();
  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方法列出了上面看到的内容。

Java代码

public voidCreateView(){
   customView = newCustomView(this);
}

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

Java代码

public class CustomView extendsView{
   LocateMe overlord;
 publicCustomView(LocateMe pCtx){
   super(pCtx);
   overlord = pCtx;
 }
 public voidonDraw(Canvas cvs){
  Paint p = newPaint();
  String sLat = "Latitude: "+ overlord.getLat();
  String sLon = "Longitude: "+ overlord.getLon();
  cvs.drawText(sLat , 32, 32, p);
  cvs.drawText(sLon, 32, 44, p);
 }
}

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

感谢阅读本文,希望能帮助到有需要的朋友,谢谢大家对本站的支持!

时间: 2016-09-28

Android中实现GPS定位的简单例子

今天弄了一个多小时,写了一个GPS获取地理位置代码的小例子,包括参考了网上的一些代码,并且对代码进行了一些修改,希望对大家的帮助.具体代码如下:  要实用Adnroid平台的GPS设备,首先需要添加上权限,所以需要添加如下权限: <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> 具体实现代码如下: 首先判断GPS模块是否存在或者是开

Android实现GPS定位代码实例

通过GPS取得的是一个Location类型的经纬度, 可以转换为两个Double 纬度和经度. 纬度: 23.223871812820435 纬度: 113.58986039161628 首先创建一个TextView和两个Button <TextView android:id="@+id/text" android:layout_width="fill_parent" android:layout_height="wrap_content"

Android GPS定位测试(附效果图和示例)

今天因为工作需要,把以前编写的一个GPS测试程序拿出来重新修改了一下.这个程序说起来有些历史了,是我11年编写的,那时候学了Android开发没多久,算是一个实验性的作品.现在工作需要,重新拿出来修整.同时发现我对android的GPS服务了解并不深,所以今天特意阅读了有关GPS服务的一些资料,把相关知识点记录下来. 本人做了GPS相关的嵌入式软件已经几年了,所以说起要做个测试GPS定位模块的程序,第一反应就是串口读取GPS模块的数据,然后解析GPS的NMEA格式数据.NMEA是一种标准化数据格

Android中GPS定位的用法实例

GPS定位是目前很多手机都有的功能,且非常实用.本文以实例形式讲述了Android中GPS定位的用法.分享给大家供大家参考之用.具体方法如下: 一般在Android中通过GPS获得当前位置,首先要获得一个LocationManager实例,通过该实例的getLastKnownLocation()方法获得第一个的位置,该方法的说明如下: void android.location.LocationManager.requestLocationUpdates(String provider, lon

python获取android设备的GPS信息脚本分享

在android上,我们可以使用QPython来编写.执行Python脚本.它对很多android 系统函数进行了方便的封装,使用QPython编写功能简单的小程序异常方便. 这个示例是我之前用来读取手机位置信息并作为进一步处理数据的基础脚本. 复制代码 代码如下: # -*- coding: utf-8 -*- import androidhelper import time from math import radians droid = androidhelper.Android() dr

Android编程获取GPS数据的方法详解

本文实例讲述了Android编程获取GPS数据的方法.分享给大家供大家参考,具体如下: GPS是Android系统中重要的组成部分,通过它可以衍生出众多的与位置相关的应用. Android的GPS有一个专门的管理类,称为LocationManager,所有的GPS定位服务都由其对象产生并进行控制. 首先需要明确的是,LocationManager类的对象获取并不是直接创建的,而是由系统提供的,具体来说,通过如下方法,为一个LocationManager对象建立一个对象引用: 复制代码 代码如下:

android通过gps获取定位的位置数据和gps经纬度

复制代码 代码如下: package com.action.android_test;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.

Android 定位系统(GPS)开发详解

全球定位系统(Global Positioning System,GPS),是一个中距离圆型轨道卫星导航系统,可以为地球表面的绝大部分地区(98%)提供准确的定位.测速和高精准的时间标准.GPS广泛运用于军事.物流.地理.移动电话.数码相机.航空领域等,具有非常强大的功能. Android支持地理定位服务的API.该地理定位服务可以用来获取当前设备的地理位置,应用程序可以定时请求更新设备当前的地理位置信息.比如应用程序可以借助一个Intent接收器来实现如下功能: 以经纬度和半径规划一个区域,当

Android使用GPS获取用户地理位置并监听位置变化的方法

本文实例讲述了Android使用GPS获取用户地理位置并监听位置变化的方法.分享给大家供大家参考,具体如下: LocationActivity.java /* LocationActivity.java * @author octobershiner * 2011 7 22 * SE.HIT * 一个演示定位用户的位置并且监听位置变化的代码 * */ package uni.location; import android.app.Activity; import android.content

Android打开GPS导航并获取位置信息返回null解决方案

最近在做一个 Android 项目,需要用到GPS获取位置信息,从 API 查了一下,发现获取位置信息仅需极其简单的一句即可: 复制代码 代码如下: getLastKnownLocation(LocationManager.GPS_PROVIDER), 于是高兴地不得了.可是一写进代码里,返回值(Location 类型)居然一直为null..郁闷的不得了.在网上查了好久,发现好多人都和我一样纠结于这个问题上,有人说是因为GPS没打开,也有人说是相关权限没加上..可是我的明明已经在设置里打开,权限

android手机获取gps和基站的经纬度地址实现代码

复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" an

Android编程实现GPS位置获取的方法

本文实例讲述了Android编程实现GPS位置获取的方法.分享给大家供大家参考,具体如下: public class GPSInfoService { private static GPSInfoService mInstance; private LocationManager locationManager;//定位服务 private GPSInfoService(Context context) { // TODO Auto-generated constructor stub loca

Android编程实现悬浮窗获取并显示当前内存使用量的方法

本文实例讲述了Android编程实现悬浮窗获取并显示当前内存使用量的方法.分享给大家供大家参考,具体如下: 运行效果: 其中: 这一块就是悬浮窗,可以随意拖动,动态显示当前内存使用量. 下面看一下代码是如何实现的: 悬浮窗的实现是用了一个service,为什么要用service呢?了解service特点的大体就会明白.下面看一下: public class FloatService extends Service { WindowManager wm = null; WindowManager.

Android编程实现通过反射获取资源Id的方法

本文实例讲述了Android编程实现通过反射获取资源Id的方法.分享给大家供大家参考,具体如下: 在将自己写的工具打成.jar包的时候,有时候会需要引用到res中的资源,这时候不能将资源一起打包,只能通过反射机制动态的获取资源. 特别用在自己定义一个工具将其打成.jar包时,特别注意资源的获取 1.封装成一个工具类 package com.cp.utils; import android.content.Context; public class CPResourceUtil { public

Android编程实现震动与振铃的方法详解

本文实例讲述了Android编程实现震动与振铃的方法.分享给大家供大家参考,具体如下: 1.Android的震动实现--Vibrator类 (1)实现震动,首先要加上使用震动所需的权限 <uses-permission android:name="android.permission.VIBRATE" /> 注:更多关于Android权限控制说明可参考http://tools.jb51.net/table/AndroidManifest (2)需要用到的API boolea

Android编程之控件ListView使用方法

本文实例讲述了Android编程之控件ListView使用方法.分享给大家供大家参考.具体分析如下: 控件ListView是一个重要的控件,可以被用作用户列表等显示,下面进行它的操作测试. 下面代码实现了生成了一个ListView显示,并对每个条目的单击事件作出响应. 源代码: package com.list; import java.util.ArrayList; import java.util.HashMap; import android.app.Activity; import an

Android编程中TextView字体属性设置方法(大小、字体、下划线、背景色)

本文实例讲述了Android编程中TextView字体属性设置方法(大小.字体.下划线.背景色).分享给大家供大家参考,具体如下: import android.content.Context; import android.graphics.Color; import android.text.SpannableString; import android.text.Spanned; import android.text.style.AbsoluteSizeSpan; import andr

Android编程实现动态更新ListView的方法

本文实例讲述了Android编程实现动态更新ListView的方法.分享给大家供大家参考,具体如下: 有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新ListView.今天的例子就是通过Handler AsyncTask两种方式来动态更新ListView.从今天起,每次学习的源代码都会打包上传,方便各位同学学习,注册帐号即可下载. 布局main.xml: <?xml

Android编程实现微信分享信息的方法

本文实例讲述了Android编程实现微信分享信息的方法.分享给大家供大家参考,具体如下: 随着微信越来越火,越来越多的应用要求有分享到微信的功能.虽然有很多平台都帮集成有分享功能,比如友盟.但是个人觉得友盟集成的东西太多了,自己封装得太过分了,很多资源文件也要带进去,所以感觉不是怎么好,所以自己也研究了一下微信的调用其SDK分享.下面说说步骤. 第一:下载官方的sdk demo. 下载地址:http://open.weixin.qq.com/download/?lang=zh_CN 第二:解压,

Android编程实现随机生成颜色的方法示例

本文实例讲述了Android编程实现随机生成颜色的方法.分享给大家供大家参考,具体如下: 网上有个ColorPicker开源项目,选择颜色值.而在这里我想实现的是动态修改一个view的背景色. 开一个线程,每隔1s修改一次view的背景色. 我们知道在Android里设置一个view的背景色有 framelayout.setBackgroundColor(Color.parseColor("#"+arg0.obj)); 就是用android的Color类去解析一个带#号的十六进制色值.

Android编程使用Intent传递对象的方法分析

本文实例分析了Android编程使用Intent传递对象的方法.分享给大家供大家参考,具体如下: 之前的文章中,介绍过Intent的用法,比如启动活动,发送广播,启发服务等,并且可以使用Intent时传递一些数据.如下代码所示: Intent intent = new Intent(this,SecondActivity.class); intent.putExtra("info", "I am fine"); startActivity(intent); 在传递数