转自我的新浪博文 

      

       在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文件中添加其权限:    
    wKiom1Lob9yhHd51AABNjzrWLHE012.jpg

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

Android GPS定位的简单应用_第1张图片
    另外一种方法使用geo命令。我们需要telnet到本机的5554端口,然后在命令行输入类似以下命令:

    geo fix -121.45365 46.51119 4392

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

Android GPS定位的简单应用_第2张图片

Android GPS定位的简单应用_第3张图片

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

wKiom1LocEDgcP6gAAA3sTFtuYw562.jpg

Android GPS定位的简单应用_第4张图片


示例代码下载

参考文章:

    《Android应用开发揭秘》

     android 模拟器上GPS的使用

     android GPS定位系统

     Android:GPS卫星定位

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

 

更多相关文章

  1. android:layout_alignParent 布局相对于父布局的位置
  2. 第五课--位置布局
  3. Android文件存储位置简述
  4. Android自定义Toast的时长、位置、及显示的View
  5. android 6.0锁屏界面时间位置修改
  6. android 修改AVD的存放位置
  7. Android的View体系(三):View坐标以及方法说明
  8. Android Studio第三十一期 - 记录RecyclerView滚动位置并恢复

随机推荐

  1. ensp起不来的原因汇总(长期更新)
  2. 为什么对象存储一定要成为2018年数据战略
  3. 简化数据获取!Uber开源深度学习分布训练库
  4. LinkedIn开源TonY:在Hadoop上运行TensorFl
  5. Kafka落选!InfoWorld最佳开源数据平台奖公
  6. 基于角色访问控制RBAC权限模型的动态资源
  7. [JS基础入门] 变量、常量及函数的语法与
  8. 在线教育大数据营销平台实战(一):大数据平台
  9. DeepMind给AI模型做了个IQ测试,结果是这样
  10. 如何将Python自然语言处理速度提升100倍: