1. 程式人生 > >【Android架構GPS篇】之GPS定位應用層流程

【Android架構GPS篇】之GPS定位應用層流程

一直想搞明白定位資料傳輸從GPS模組到應用層APK的整個流程:Linux串列埠驅動、Android HAL、Android Framework、最終應用程式,同時也瞭解下每個層次都對資料做了什麼限制與手腳!

這裡先了解下應用層流程。


根據這個框架,GPS在應用層實現的最基本流程示例:

[java] view plain copy  print?
  1. publicclass MainActivity extends Activity {  
  2.     private LocationManager mLocationManager;  
  3.     @Override
  4.     protected
    void onDestroy() {  
  5.         super.onDestroy();  
  6.         mLocationManager.removeUpdates(locationListener);  
  7.     }  
  8.     @Override
  9.     publicvoid onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         setContentView(R.layout.activity_main);  
  12.         /* 記得在AndroidManifest.xml檔案中開啟GPS相關的許可權!!! */
  13.         mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);  
  14.         /* 檢測GPS定位模組是否開啟 */
  15.         if (!mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {  
  16.             /* 針對GPS定位模組是否開啟,具體接下來做的事 */
  17.             return;  
  18.         }  
  19.         Location location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);  
  20.         updateLocationMessage(location);  
  21.         /* 監聽GPS的狀態變化 */
  22.         mLocationManager.addGpsStatusListener(listener);  
  23.         /* 監聽GPS的位置變化 
  24.          * 這裡指定2000ms或者移動距離超過4m的時候更新一次位置資訊,但是 
  25.          * 經過實際測試,更新間隔精確度極低,根本不按套路走。實際使用的話,還是採用Send Measage方式 
  26.          */
  27.         mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 20004, locationListener);  
  28.     }  
  29.     /* 監聽GPS的狀態變化 */
  30.     GpsStatus.Listener listener = new GpsStatus.Listener() {  
  31.         publicvoid onGpsStatusChanged(int event) {  
  32.             switch (event) {  
  33.             /* 第一次獲取到定位資訊 */
  34.             case GpsStatus.GPS_EVENT_FIRST_FIX:  
  35.                 break;  
  36.             /* 衛星狀態發生變化,捕獲到衛星/衛星不可見 */
  37.             case GpsStatus.GPS_EVENT_SATELLITE_STATUS:  
  38.                 break;  
  39.             case GpsStatus.GPS_EVENT_STARTED:  
  40.                 break;  
  41.             case GpsStatus.GPS_EVENT_STOPPED:  
  42.                 break;  
  43.             }  
  44.         };  
  45.     };  
  46.     private LocationListener locationListener = new LocationListener() {  
  47.         @Override
  48.         publicvoid onLocationChanged(Location location) {  
  49.             updateLocationMessage(location);  
  50.         }  
  51.         @Override
  52.         publicvoid onStatusChanged(String provider, int status, Bundle extras) {  
  53.             switch (status) {  
  54.             case LocationProvider.AVAILABLE:  
  55.                 break;  
  56.             case LocationProvider.OUT_OF_SERVICE:  
  57.                 break;  
  58.             case LocationProvider.TEMPORARILY_UNAVAILABLE:  
  59.                 break;  
  60.             }  
  61.         }  
  62.         @Override
  63.         publicvoid onProviderEnabled(String provider) {  
  64.         }  
  65.         @Override
  66.         publicvoid onProviderDisabled(String provider) {  
  67.         }  
  68.     };  
  69.     privatevoid updateLocationMessage(Location location) {  
  70.     }  
  71. }  

上面提到的是GPS最基礎的框架流程,此外它還有你想得到、想不到的其他許多用法與功能。

在Android的location包中,所有與定位相關的類和介面如下:

Address

representing an Address, i.e, a set of Strings describing a location

描述地址資訊

Criteria

indicating the application criteria for selecting a location provider

根據自己要求,選擇LocationProvider

Geocoder

handling geocoding and reverse geocoding

處理地理位置資訊的編碼

GpsSatellite

representing the current state of a GPS satellite

描述GPS衛星當前狀態

GpsStatus

representing the current state of the GPS engine

描述GPS裝置的當前狀態

Location

representing a geographic location sensed at a particular time

描述地理位置資訊,如經度、緯度、高度、方向、運動速度等

LocationManager

provideing access to the system location services

用於呼叫、管理系統定位服務,是整個定位服務的入口、核心

LocationProvider

An abstract superclass for location providers. A location provider provides periodic reports on the geographical location of the device

描述location providers的抽象超類,是真正用來獲取位置資訊的

介面

GpsStatus.Listener

receiving notifications when GPS status has changed

接收GPS狀態改變時的通知

GpsStatus.

NmeaListener

receiving NMEA sentences from the GPS

接收GPS的NMEA資訊

LocationListener

receiving notifications from the LocationManager when the location has changed

接收GPS位置資訊改變時的通知