Android定位功能

废话不多说,直接开始说说与实现Android定位有关的API吧。

  这些API都在android.location包下,一共有三个接口和八个类。它们配合使用即可实现定位功能。

 

  三个接口:

  GpsStatus.Listener: 这是一个当GPS状态发生改变时,用来接收通知的接口。

  GpsStatus.NmeaListener: 这是一个用来从GPS里接收Nmea-0183(为海用电子设备制定的标准格式)信息的接口。

  LocationListener: 位置监听器,用于接收当位置信息发生改变时从LocationManager接收通知的接口。

 

  八个类:

  Address: 描述地址的类,比如:北京天安门

  Criteria: 用于描述Location Provider标准的类,标准包括位置精度水平,电量消耗水平,是否获取海拔、方位信息,是否允许接收付费服务。

  GeoCoder: 用于处理地理位置的编码。

  GpsSatellite: 和GpsStatus联合使用,用于描述当前GPS卫星的状态。

  GpsStatus: 和GpsStatus.Listener联合使用,用于描述当前GPS卫星的状态。

  Location: 用于描述位置信息。

  LocationManager: 通过此类获取和调用系统位置服务

  LocationProvider: 用于描述Location Provider的抽象超类,一个LocationProvider应该能够周期性的报告当前设备的位置信息。

 

  这里通过一个代码示例,演示一下如何实现定位。

  首先,在AndroidManifest.xml清单文件里需要加入ACCESS_FINE_LOCATION权限

1 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>

其次,实现代码如下:

001 package com.test;
002   
003  import java.io.IOException;
004  import java.util.List;
005   
006  import android.app.Activity;
007  import android.location.Address;
008  import android.location.Criteria;
009  import android.location.Geocoder;
010  import android.location.Location;
011  import android.location.LocationListener;
012  import android.location.LocationManager;
013  import android.os.Bundle;
014  import android.util.Log;
015  import android.widget.Toast;
016   
017  public class MainActivity extends Activity
{
018      @Override
019      public void onCreate(Bundle
savedInstanceState) {
020         super.onCreate(savedInstanceState);
021         setContentView(R.layout.main);
022          
023         //获取到LocationManager对象
024         LocationManager
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
025         //创建一个Criteria对象
026         Criteria
criteria = 
new Criteria();
027         //设置粗略精确度
028         criteria.setAccuracy(Criteria.ACCURACY_COARSE);
029         //设置是否需要返回海拔信息
030         criteria.setAltitudeRequired(false);
031         //设置是否需要返回方位信息
032         criteria.setBearingRequired(false);
033         //设置是否允许付费服务
034         criteria.setCostAllowed(true);
035         //设置电量消耗等级
036         criteria.setPowerRequirement(Criteria.POWER_HIGH);
037         //设置是否需要返回速度信息
038         criteria.setSpeedRequired(false);
039   
040         //根据设置的Criteria对象,获取最符合此标准的provider对象
041         String
currentProvider = locationManager.getBestProvider(criteria, 
true);
042         Log.d("Location""currentProvider:
"
 +
currentProvider);
043         //根据当前provider对象获取最后一次位置信息
044         Location
currentLocation = locationManager.getLastKnownLocation(currentProvider);
045         //如果位置信息为null,则请求更新位置信息
046         if(currentLocation
== 
null){
047             locationManager.requestLocationUpdates(currentProvider, 00,
locationListener);
048         }
049         //直到获得最后一次位置信息为止,如果未获得最后一次位置信息,则显示默认经纬度
050         //每隔10秒获取一次位置信息
051         while(true){
052             currentLocation
= locationManager.getLastKnownLocation(currentProvider);
053             if(currentLocation
!= 
null){
054                 Log.d("Location""Latitude:
"
 +
currentLocation.getLatitude());
055                 Log.d("Location""location:
"
 +
currentLocation.getLongitude());
056                 break;
057             }else{
058                 Log.d("Location""Latitude:
"
 0);
059                 Log.d("Location""location:
"
 0);
060             }
061             try {
062                 Thread.sleep(10000);
063             catch (InterruptedException
e) {
064                  Log.e("Location",
e.getMessage());
065             }
066         }
067          
068         //解析地址并显示
069         Geocoder
geoCoder = 
new Geocoder(this);
070         try {
071             int latitude
= (
int)
currentLocation.getLatitude();
072             int longitude
= (
int)
currentLocation.getLongitude();
073             List<Address>
list = geoCoder.getFromLocation(latitude, longitude, 
2);
074             for(int i=0;
i<list.size(); i++){
075                 Address
address = list.get(i);
076                 Toast.makeText(MainActivity.this,
address.getCountryName() + address.getAdminArea() + address.getFeatureName(), Toast.LENGTH_LONG).show();
077             }
078         catch (IOException
e) {
079             Toast.makeText(MainActivity.this,e.getMessage(),
Toast.LENGTH_LONG).show();
080         }
081          
082      }
083       
084      //创建位置监听器
085      private LocationListener
locationListener = 
new LocationListener(){
086          //位置发生改变时调用
087          @Override
088          public void onLocationChanged(Location
location) {
089              Log.d("Location""onLocationChanged");
090              Log.d("Location""onLocationChanged
Latitude"
 +
location.getLatitude());
091                   Log.d("Location""onLocationChanged
location"
 +
location.getLongitude());
092          }
093   
094          //provider失效时调用
095          @Override
096          public void onProviderDisabled(String
provider) {
097              Log.d("Location""onProviderDisabled");
098          }
099   
100          //provider启用时调用
101          @Override
102          public void onProviderEnabled(String
provider) {
103              Log.d("Location""onProviderEnabled");
104          }
105   
106          //状态改变时调用
107          @Override
108          public void onStatusChanged(String
provider, 
int status,
Bundle extras) {
109              Log.d("Location""onStatusChanged");
110          }
111      };
112  }

由于代码里的Criteria对象对位置精度要求并不高,所以一般会返回“network”作为provider,而基于network的定位往往会存在一定的位置偏差,这对于需要精确定位的应用程序来说,显然不合要求。这时,需要则需要用到基于GPS的定位方法了

在实现GPS定位前,先了解一下GPS的部分特性:

  1. GPS定位需要依靠3颗或3颗以上的卫星。

  2. GPS定位受环境影响较大,在晴朗的空地上,较容易搜索到卫星,而在室内通常是无法搜索到卫星的。

  3. GPS定位需要使用GPS功能模块,而GPS功能模块的耗电量是巨大的。

  在Android系统中,实现GPS定位的思路应该是:

  1. 获取GPS的Location Provider。

  2. 讲此Provider传入到requestLocationUpdates()方法,让Android系统获知搜索位置方式。

  3. 创建实现了GpsStatus.Listener接口的对象,重写onGpsStatusChanged()方法,向LocationManager添加次监听器,检测卫星状态。(可选步骤)

001 public class MainActivity extends Activity
{
002      private LocationManager
locationManager;
003      private GpsStatus
gpsstatus;
004      @Override
005      public void onCreate(Bundle
savedInstanceState) {
006         super.onCreate(savedInstanceState);
007         setContentView(R.layout.main);
008          
009         //获取到LocationManager对象
010         locationManager
= (LocationManager) getSystemService(LOCATION_SERVICE);
011          
012         //根据设置的Criteria对象,获取最符合此标准的provider对象
013         String
currentProvider = locationManager.getProvider(LocationManager.GPS_PROVIDER).getName();
014          
015         //根据当前provider对象获取最后一次位置信息
016         Location
currentLocation = locationManager.getLastKnownLocation(currentProvider);
017         //如果位置信息为null,则请求更新位置信息
018         if(currentLocation
== 
null){
019             locationManager.requestLocationUpdates(currentProvider, 00,
locationListener);
020         }
021         //增加GPS状态监听器
022         locationManager.addGpsStatusListener(gpsListener);
023          
024         //直到获得最后一次位置信息为止,如果未获得最后一次位置信息,则显示默认经纬度
025         //每隔10秒获取一次位置信息
026         while(true){
027             currentLocation
= locationManager.getLastKnownLocation(currentProvider);
028             if(currentLocation
!= 
null){
029                 Log.d("Location""Latitude:
"
 +
currentLocation.getLatitude());
030                 Log.d("Location""location:
"
 +
currentLocation.getLongitude());
031                 break;
032             }else{
033                 Log.d("Location""Latitude:
"
 0);
034                 Log.d("Location""location:
"
 0);
035             }
036             try {
037                 Thread.sleep(10000);
038             catch (InterruptedException
e) {
039                  Log.e("Location",
e.getMessage());
040             }
041         }
042      }
043       
044      private GpsStatus.Listener
gpsListener = 
new GpsStatus.Listener(){
045          //GPS状态发生变化时触发
046          @Override
047          public void onGpsStatusChanged(int event)
{
048              //获取当前状态
049              gpsstatus=locationManager.getGpsStatus(null);
050              switch(event){
051                  //第一次定位时的事件
052                  case GpsStatus.GPS_EVENT_FIRST_FIX:
053                      break;
054                  //开始定位的事件
055                  case GpsStatus.GPS_EVENT_STARTED:
056                      break;
057                  //发送GPS卫星状态事件
058                  case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
059                      Toast.makeText(MainActivity.this"GPS_EVENT_SATELLITE_STATUS",
Toast.LENGTH_SHORT).show();
060                      Iterable<GpsSatellite>
allSatellites = gpsstatus.getSatellites();  
061                      Iterator<GpsSatellite>
it=allSatellites.iterator();
062                      int count
0;
063                      while(it.hasNext())  
064                      {  
065                          count++;
066                      }
067                      Toast.makeText(MainActivity.this"Satellite
Count:"
 +
count, Toast.LENGTH_SHORT).show();
068                      break;
069                  //停止定位事件
070                  case GpsStatus.GPS_EVENT_STOPPED:
071                      Log.d("Location""GPS_EVENT_STOPPED");
072                      break;
073              }
074          }
075      };
076       
077       
078      //创建位置监听器
079      private LocationListener
locationListener = 
new LocationListener(){
080          //位置发生改变时调用
081          @Override
082          public void onLocationChanged(Location
location) {
083              Log.d("Location""onLocationChanged");
084          }
085   
086          //provider失效时调用
087          @Override
088          public void onProviderDisabled(String
provider) {
089              Log.d("Location""onProviderDisabled");
090          }
091   
092          //provider启用时调用
093          @Override
094          public void onProviderEnabled(String
provider) {
095              Log.d("Location""onProviderEnabled");
096          }
097   
098          //状态改变时调用
099          @Override
100          public void onStatusChanged(String
provider, 
int status,
Bundle extras) {
101              Log.d("Location""onStatusChanged");
102          }
103      };
104  }

通过以上代码中的注释部分,可以清晰的知道Android定位功能里相关方法的具体含义。希望对大家有用。

  另外,因为GPS的自身特性,此代码在室内几乎无法定位,所以建议再真正的实际项目里,至少使用network和GPS两种不同的Location Provider实现定位功能。

时间: 2024-08-04 14:36:59

Android定位功能的相关文章

JavaScript微信定位功能实现方法_javascript技巧

分享下微信是如何定位的: 本文主要讲解如何利用微信定位,如何将定位到的经纬度转换为百度地图对应的经纬度,以及处理定位失败.取消及错误时的默认做法. //获取地理位置信息start //封装成一个函数 function getPosition() { //用ajax请求 $.ajax({ url: "/wechat/jssdk",//请求地址 type: 'post',//post请求 dataType: 'json', contentType: "application/x-

Flex AIR应用GPS定位功能(Android和IOS)

说明:使用AIR进行GPS定位功能实现时,会经常判断GPS是否打开.一般的官方或者书上的介绍的方法,测试后,只能对Android系统进行判断,而对ios系统则无法进行判断. 经过研究测试,终于解决实现了能够同时适应于Android和ios系统的GPS定位功能.   实现:  1) 实例化Geolocation类,并添加监听,用于获取经纬度信息   注:geolocation = new Geolocation(); 该实例对象是全局声明,但必须是局部实例化,而不能把它声明为全局的变量实例化(即不

Android仿微信通讯录滑动快速定位功能

先给大家展示下效果图: 实现代码如下: 下面简单说下实现原理. public class IndexBar extends LinearLayout implements View.OnTouchListener { private static final String[] INDEXES = new String[]{"#", "A", "B", "C", "D", "E", &qu

Android 定位服务

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

关闭定位功能也没用iPhone仍会泄露行踪

早报讯 美国苹果公司在用户信息收集知情权问题上面临新的质疑.<华尔街日报>4月25日披露的一项测试结果显示,苹果的iPhone手机在定位功能关闭后仍在收集用户的位置信息. 在上周率先披露谷歌.苹果均收集手机用户位置信息后,<华尔街日报>科技记者詹妮弗·瓦伦蒂诺·德弗里斯又进行了新测试.这次德弗里斯使用的手机,是恢复至出厂设置并使用苹果iOS最新版操作系统的iPhone 4. 测试步骤如下:德弗里斯首先关掉iPhone默认为"打开"的定位功能,并立刻记录系统文件中

ios-大神留步!!!iOS能不能关闭GPS定位而只开启其他的定位功能?

问题描述 大神留步!!!iOS能不能关闭GPS定位而只开启其他的定位功能? 在开发过程中想要测试下,如果不开启GPS定位功能,用其他定位服务是否也能实现定位功能. 但是手机测是时候如果关闭定位服务的话,就把所有的定位功能都关闭了.有没有一种方法关闭GPS而只检测WiFi定位之类的办法,还是应该在代码中添加什么关闭GPS定位服务的代码吗??? 解决方案 iOS中GPS定位 解决方案二: 明确告诉你,你没有大量的地理信息,所以绝对不可以,你可以提示用户

Flash+XML实现电子地图查询及定位功能

xml 上一讲,我们实现了电子地图中如何在线标注地名功能(参阅<Flash+ASP实现电子互动地图在线标注功能>),本例我们一讲中我们学习实现按地名名称查询及定位功能. 本例要实现的功能分成"查询"和"定位"两部分,查询功能通过调用XML文件的数据一一比对实现.定位功能通过将地图进行适当的缩放和移动,将被查询到的地名显示在窗口的中央位置来实现. 制作步骤: 制作如图所示的界面: 图1 查询功能的界面 用input_txt动态文本框接收输入的地名名称.用载

在Word 2010中使用“定位”功能快速翻页

当用户想要在一个比较长的Word 2010文档中快速定位到某个特定页时,可以借助Word 2010提供的"定位"功能实现快速翻页,操作步骤如下所述: 第1步,打开Word 2010长文档,在"开始"功能区的"编辑"分组中单击"查找"按钮右侧的下拉三角按钮,并单击"转到"命令,如图2010081219所示. 图2010081219 单击"转到"命令 第2步,打开"查找和替换&qu

如何使用HTML5地理位置定位功能

  如何使用HTML5地理位置定位功能         用相对简单的JavaScript代码,可以创建出能确定用户地理位置详细信息的Web应用,包括经纬度以及海拔等.一些Web应用甚至能通过监控用户位置随时间的移动来提供导航功能,其中还综合了GoogleMaps API这样的地图系统. HTML5提供了地理位置定位功能(Geolocation API),能确定用户位置,我们可以借助HTML5的该特性开发基于地理位置信息的应用.本文结合实例给大家分享如何使用HTML5,借助百度.谷歌地图接口来获取