Android GPS應用程序設計
GPS簡介
GPS是英文Global Positioning System(全球定位系統)的簡稱。GPS是20世紀70年代由美國陸海空三軍聯合研制的
新一代空間衛星導航定位系統 。其主要目的是為陸、海、空三大領域提供實時、 全天候和全球性的導航服務,并用于
情報收集、核爆監測和應急通訊等一些軍事目的,經過20余年的研究實驗,耗資300億美元,到1994年3月,全球覆蓋
率高達98%的24顆GPS衛星星座己布設完成。
GPS定位原理
GPS定位的基本原理是根據高速運動的衛星瞬間位置作為已知的起算數據,采用空間距離后方交會的方法,確定待測
點的位置。如圖所示,假設t時刻在地面待測點上安置GPS接收機,可以測定GPS信號到達接收機的時間△t,再加上接
收機所接收到的衛星星歷等其它數據可以確定以下四個方程式)
GPS的基本類
Android平臺提供了一個android.location的包,有8個類。核心的3個類:
LocationManager類:作用與WifiManager、TelephonyManager等服務類的作用相似,所有與GPS定位相關的服務、
對象都由該對象產生。
LocationProvider類:定位提供者,GPS定位組件的抽象表示,通過該對象可以獲取該定位組件的相關信息。
Location類:一個代表位置信息的抽象類。
使用它們來獲取GPS定位信息的通用步驟為:
獲取系統LocationManager對象
使用LocationManager,通過指定的定位設備LocationProvider來獲取定位信息Location。
從Location對象中獲取定位信息
LocationManager
LocationManager對象的獲取:
LocationManager lm= (LocationManager)getSystemService(Context.LOCATION_SERVICE);
常用方法
List<String> getAllProviders() 獲得所有的LocationProvider列表
LocationProvider getProvider(String name) 根據名稱來獲取LocationProvider
List<String> getProviders(boolean enabledOnly) 獲取所有可用的LocationProvider
List<String> getProviders(Criteria criteria, boolean enabledOnly) 根據指定條件獲取滿足該條件的全部LocationProvider的名稱
String getBestProvider(Criteria criteria, boolean enabledOnly) 根據指定條件返回最優的LocationProvider對象
boolean isProviderEnabled(String provider) 判斷指定名稱的LocationProvider是否可用
Location getLastKnownLocation(String provider) 獲取最近一次已知的Location
addProximityAlert(double latitude, double longitude, float radius, long expiration, PendingIntent intent) :添加一個趨近
警告
void removeProximityAlert(PendingIntent intent) 刪除一個臨近警告
void requestLocationUpdates(long minTime, float minDistance, Criteria criteria, PendingIntent intent)
void requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener) 通過指定的
LocationProvider周期性地獲取定位信息,并通過intent啟動相應的組件
void requestLocationUpdates(String provider, long minTime, float minDistance, PendingIntent intent) 通過指定的
LoctionProvider周期性地獲取定位信息,并通過intent啟動相應的組件
LocationProvider (定位提供者)
abstract int getAccuracy() 返回該LocationProvider的精度
String getName() 返回該LocationProvider的名稱
int getPowerRequirement() 獲取該LoctionProvider的電源需求
boolean hasMonetaryCost() 獲取該LocationProvider是收費的還是免費的
boolean meetsCriteria(Criteria criteria) 判斷該LocationProvider是否滿足Criteria條件
boolean requiresCell() 判斷該LocationProvider是否需要訪問網絡基站
boolean requiresNetwork() 判斷該LocationProvider是否需要訪問網絡數據
boolean requiresSatellite() 判斷該LoctionProvider是否需要訪問基于衛星的定位系統
boolean supportsAltitude() 判斷該LoctionProvider是否支持高度信息
boolean supportsBearing() 判斷該LocationProvider是否支持方向信息
boolean supportsSpeed() 判斷該LoctionProvider是否支持速度信息
Location(位置信息)
float getAccuracy() 獲取定位信息的精度
double getAltitude() 獲取定位信息的高度
float getBearing() 獲取定位信息的方向
double getLatitude() 獲取定位信息的緯度
double getLongitude() 獲取定位信息的經度
String getProvider() 獲取提供該定位信息的LocationProvider
float getSpeed() 獲取定位信息的速度
long getTime()
boolean hasAccuracy() 判斷該定位信息是否有精度信息
boolean hasAltitude() 判斷該定位信息是否有高度信息
boolean hasBearing() 判斷該定位信息是否有方向信息
boolean hasSpeed() 判斷該定位信息是否有速度信息
獲取定位信息
1 獲取所有可用的LocationProvider
LocationManager提供了一個getAllProvider()方法來獲取系統所有可用的LocationProvider
系統共有三種類型的LocationProvider
network : 由LocationManager.NETWORK_PROVIDER常量表示
gps : 由LocationManager.GPS_PROVIDER常量表示
passive : 由LoctionManager.PASSIVE_PROVIDER常量表示
2 通過名稱獲得指定getProvider(String name)
3 根據Criteria獲得getProviders(Criteria criteria, boolean enabledOnly)
Criteria:代表了一個“過濾”條件,它提供了一些方法來設置條件
void setAccuracy(int accuracy)
void setAltitudeRequired(boolean altitudeRequired)
void setBearingAccuracy(int accuracy)
void setBearingRequired(boolean bearingRequired)
獲取LocationManager對象后,可通過指定的LocationProvider獲取定位信息,如:經度、維度、高度、移動速度等。
GPS訪問權限
<uses-permission android:name=“android.permission.ACCESS_FINE_LOCATION”>
趨近警告
趨近警告就是當用戶手機臨近指定點時,當與該點的距離小于指定范圍時,系統可觸發相應的處理,該功能能夠對我們
進入或退出某個設定的區域進行提示。
LocationManager提供方法:addProximityAlert(double latitude, double longitude, float radius, long expiration,
PendingIntent intent),
latitude經度、longitude緯度, radius區域半徑, expiration指定經過多少毫秒過期,-1為永不過期,PendingIntent指
定觸發的Intent組件。
要實現此功能需要兩個步驟:
一是獲得LocationManager實例,調用其方法addProximityalert并添加趨近提示;
二是定義一個廣播接收器,當設備進入設定區域時提醒用戶。
例子代碼:
獲取LocationProvider:
獲取所有的LocationProvider的名稱