转自我的新浪博文 

      

       在Android的位置服务中,有两个重要的类LocationManager和LocationProvider,提供了一系列方法来处理与位置相关的问题,包括查询一个已知位置;注册(注销)来自某个LocationProvider的周期性的位置更新;以及注册(注销)接近某个坐标时对一个已定义Intent的触发等。 

    Android的地理定位系统的API位于android.location包内,其中包含了以下几个重要的功能类:

1、LocationManager:

    本类提供访问定位服务的功能,另外也提供获取最佳定位提供者的功能。

2、LocationProvider:

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

3、Criteria:

    可译为标准、规则,用于在可以获得的LocationProvider列表中获取合适的定位提供者。不同的定位提供者具有不同的精确度、灵敏度等指标,通过定义Criteria并设置其属性,可以选择合适的定位提供者。

4、LocationListener:

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

5、Geocoder:

    用于处理地理编码和反向地理编码的类。地理编码是指将地址或其他描述转变为经度和纬度,反向地理编码则是将经度和纬度转变为地址或描述语言,其中包含了两个构造函数,需要传入经度和纬度的坐标。

    要使用地理定位,首先需要取得LocationManager的实例,在Android中,获得LocationManager的唯一方法是通过getSystemService方法的调用。

    String serviceName = Context.LOCATION_SERVICE;  
    LocationManager    locationManager = (LocationManager) getSystemService(serviceName);

    通过使用LocationManager,我们可以获得一个位置提供者的列表。在一个真实的手持设备中,这个列表包含了一些GPS服务(或基于网络的位置信息服务等)。我们可以通过设置一些标准来选择合适的位置提供者:

    Criteria criteria = new Criteria();  
    criteria.setAccuracy(Criteria.ACCURACY_FINE);【高精确度】  
    criteria.setAltitudeRequired(false); 【设置是否需要高度信息】 
    criteria.setBearingRequired(false);【设置是否需要方位信息】 
    criteria.setCostAllowed(true);【设置是否允许产生费用】  
    criteria.setPowerRequirement(Criteria.POWER_LOW);【设置耗电的高低】  
    String provider = locationManager.getBestProvider(criteria, true);

    当然,我们也可以直接选择更强大、更精确、不带其他附加服务的GPS:

    String provider = LocationManager.GPS_PROVIDER;

    得到了LocationManager的实例以后,我们通过下面的语句来注册一个周期性的位置更新:

    private static final int step = 2000; 【2s】

    ......

    locationManager.requestLocationUpdates(provider, step, 0,  locationListener);

    其中第一个参数是设置服务提供者,第二个参数是周期,第三个参数是以米为单位的最小位置变化,最后一个参数locationListener,是用来监听定位信息的改变。

    这句代码告诉系统,我们需要从位置提供者(如GPS)获取位置信息,并且是每隔2000ms更新一次,不考虑最小位置变化。


    locationListener必须要实现如下方法:

1、onLocationChanged(Location location)

    当坐标改变时候触发该函数,如果Provider传相同的坐标,它就不会触发。

2、onProviderDisabled(String provider)

    Provider禁用时触发此函数,比如GPS被关闭。

3、onProviderEnabled(String provider)

    Provider启用时触发此函数,比如GPS被打开。

4、onStatusChanged(String provider, int status, Bundle extras)

    Provider的状态在可用、暂时不可用和无服务三个状态直接切换时触发此函数。

    要使用定位的API,还需要在AndroidManifest.xml文件中添加其权限:    
    

    如果在模拟器上测试,需要人为的设置一个坐标。有两种方法来设置一个模拟的坐标值。第一种方法是通过DDMS,我们可用在Eclipse的ADT插件中使用这种方法,只要启动Eclipse,选择“Window”->“Show View”,打开“Emulator Control”界面,手动或者通过KML和GPX文件来设置一个坐标:


    另外一种方法使用geo命令。我们需要telnet到本机的5554端口,然后在命令行输入类似以下命令:

    geo fix -121.45365 46.51119 4392

    后面三个参数分别是经度、纬度和(可选)海拔。设置后再Android模拟器屏幕上便多出了一个如下图所示的标志,表示模拟了GPS权限:

    使用telnet命令的示意图如下:




示例代码下载

参考文章:

    《Android应用开发揭秘》

     android 模拟器上GPS的使用

     android GPS定位系统

     Android:GPS卫星定位

     初探Android平台上的定位服务(GPS)

 

更多相关文章

  1. 第五课--位置布局
  2. android ListView根据字母排序和定位
  3. android 三种定位方式
  4. Android文件存储位置简述
  5. 室内定位导航系统设计实现指南
  6. 浅谈Android五大布局
  7. android ListView根据字母排序和定位
  8. Android(安卓)五大布局
  9. 浅谈Android五大布局

随机推荐

  1. android多线程模型和service分析
  2. android中图片的三级cache策略(内存、文件
  3. Android中的手势交互
  4. android 动画分析
  5. Android进程通信Binder(2)-Android系统服
  6. 关于Android的问号(?)和 @符号的用法
  7. Android上定义播放器控件UniversalVideoV
  8. Android源码分析系列-整理篇
  9. 什么是Mono for Android?
  10. 『转』Android(安卓)推送方式