關於Android應用中的GPS衛星定位。
一、應用層實現
1.首先需要在AndroidMainfest.xml中開啟定位權限。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> //開啟精確定位權限,誤差一般為三到十米。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> //開啟粗略定位權限,誤差一般不超過1.5km。
2.創建LocaionManager(位置管理器、總控制器)對象。
LocationManager mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
3.創建Location(位置)對象。
Location location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
/* Location類的常用方法:location.getLongitude(); //獲取經度
location.getLatitude(); //獲取緯度
location.getAltitude(); //獲取海拔
location.getTime(); //獲取時間 */
//AS下該語句報錯,ALT+ENTER出現額外代碼塊,該代碼塊檢查定位權限是否開啟。
4.創建LocationListener對象,監聽位置變化,LocationListener為接口,故需要實現類,本文使用匿名內部類實現。
LocationListener mLocationListener = new LocationListener(){
@Override
public void onLocationChanged(){ //位置變化時該方法自動觸發
//自己定義的方法體
}
@Override
public void onStatusChanged(String provider , int status , Bundle extra){
//provider:我的手機上值是gps,status:GPS狀態,extra:額外信息
/* status(GPS狀態) 一共有三種:1.LocationProvider.AVAILABLE; 服務可獲得
2.LocationProvider.OUT_OF_SERVICE; 不在服務區
3.LocationProvider.TEMPORARITY_UNAVAILABLE; 服務未提供
//自己定義方法體
}
@Override
public void onProviderEnabled(String provider){
//當用戶啟用具有定位功能的硬件時調用
//自己定義方法體
}
@Override
public void onProviderDisabled(){
//當用戶禁用具有定位功能的硬件時調用
//自己定義方法體
}
};
5.創建GpsStatus.Listener對象,其中Listener是GpsStatus的一個成員內部類(Listener是一個接口,仍然需要實現類,本文仍然采用匿名內部類)。
//細心的朋友也許會發現前面的mLocationListener也實現了類似的功能,沒錯。
GpsStatus.Listener mListener = new GpsStatus.Listener(){
@Override
public void onGpsStatusChanged(int event){
//event代表GPS的狀態
//自己定義方法體
}
};
mLocationManager.addGpsStatusListener(mListener); //別忘了注冊監聽器
6.創建GpsStatus對象。
GpsStatus mGpsStatus = mLocationManager.getGpsStatus(null);
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
只需要實時定位信息的話只需要完成前四步即可。
細心的朋友可能會發現GpsStatus的功能似乎與LocationListener有點重復,沒錯,GpsStatus最有用的功能(個人見解)其實是開啟查分定位數據監聽,但目前的移動設備具博主
所知大部分都是單點定位,想使用差分定位需要廠商定制,所以只在具體的環境中使用。
mLocationManager.addNmeaListener(new GpsStatus.NmeaListener(){
@Override
public void onNmeaReceived(long l , String s){ //接收到Nmea數據時該方法會被調用,l表示數據長度,s表示數據本身
//自己定義方法體
}
});