手机设备的移动性决定了手机在位置服务方面拥有比固定设备更多的优势,可以开发多种基于移动设备的位置服务应用程序。
Android SDK 提供了 android.location 包和 Google Maps API 支持位置服务功能,开发人员可以方便地开发自己的位置服务应用程序。
Android 系统支持 GPS 定位方式和网络定位方式。GPS 方式的位置信息来自卫星,精度很高,但是 GPS 方式仅在户外有效,其首次获取位置时间较长并且非常耗费电量。
而网络定位方式使用的是移动通信****和WIFI信号,这种方式在室内和户外都可以使用,响应快速,费电较少,但是精度难以保证。开发者应该根据应用程序的使用环境来确定具体的定位方式。
LocationManager 介绍
在 Android 的位置服务中,LocationManager 是一个非常重要的类,它位于 android.location 包中。
LocationManager 类用于管理 Android 用户位置服务信息,提供确定用户位置的 API,通过这个类可以实现定位、跟踪和目标趋近等功能。
LocationManager 对象不能直接实例化,可以通过 Context.getSystemService(Context. LOCATION_SERVICE) 方法获得。
LocationManager 对象可以完成以下三个方面的任务:
从用户的位置查询所有可用的 LocationProvider 列表。
从特定的 LocationProvider 周期性获取用户当前位置的功能。
当用户位置接近某个特定区域时,启动相关任务。
表 1 所示为 LocationManager 类的常用方法。
LocationProvider介绍
LocationProvider 为位置提供者的抽象类,位置提供者提供手机设备周期性的地理位置报告。
LocationProvider 的常用方法如表 2 所示。
根据设备的不同可以使用不同的定位技术来实现位置服务,也就是获取不同的 LocationProvider,以下是 3 种获取 LocationProvider 实例的方法。
1)通过指定名称获取
根据 LocationManager 中的静态常量 GPS_PROVIDER 和 NETWORK_PROVIDER 来分别获得 GPS Provider 和 Network Provider,例如:
LocationManager manager=(LocationManager)getSystemService (Context.LOCATION_SERVICE); //指定 Provider 名称为 LocationManager.GPS_PROVIDER LocationProvider MyProvider=manager.getProvider(LocationManager.GPS_PROVIDER);
2)获取可使用的 LocationProvider 实例列表
通过调用 locationManager.getProviders(true) 方法就可以获得可利用的 LocationProvider 实例列表,例如:
342oolean enabledOnly=true; //获取 Provider 的集合 List<String>providers=locationManager.getProviders(enabledOnly);
3)根据 Criteria 获取符合条件的 LocationProvider 实例
每个 LocationProvider 都有一个条件集合,以便于应用程序可以选择合适的位置提供者。
例如有的 LocationProvider 要求设备本身具有 GPS 模块,并且要求看见卫星的数量,有的要求手机设备能够接入 Internet 或者特定网络等。Criteria 类被用于为 LocationProvider 设置相关条件。
Criteria 对象封装了获得 LocationProvider 实例的条件,可以根据指定的 Criteria 条件来过滤 LocationProvider 列表,以得到符合条件的 LocationProvider 实例。
Criteria 的常用方法如表 3 所示。
下面的代码使用 Criteria 对象创建了一个条件集,并根据该条件集查找到合适的 LocationProvider 对象,并从该 LocationProvider 对象获取位置信息。
//获取 Criteria 对象 Criteria criteria=new Criteria(); //设置需要更精细的定位精度要求 criteria.setAccuracy (Criteria.ACCURACY_FINE); //设置定位不需要高度信息 criteria.setAltitudeRequired (false); //设置不需要提供轴承信息 criteria.setBearingRequired (false); //设置允许收费 criteria.setCostAllowed (true); //设置低耗能 criteria.setPowerRequirement (Criteria.POWER_LOW); //根据设置的条件获取合适的 provider String provider=locationManager.getBestProvider (criteria,true); //得到 Location 对象 Location location=locationManager.getLastKnownLocation (provider);
4)LocationListener,提供定位信息发生改变时的回调功能。
此接口提供了 4 个常用方法,如表 4 所示。