Android中LocationManager的簡單使用,獲取當前位置

Android中LocationManager的提供了一系列方法來地理位置相關的問題,包括查詢上一個已知位置;註冊/註銷來自某個 LocationProvider的週期性的位置更新;以及註冊/註銷接近某個座標時對一個已定義Intent的觸發等。今天我們就來看看Android 中LocatinManager的簡單使用,以獲取當前所在的位置爲例。

首先,我們需要獲取LocationManager的一個實例,這裏需要注意的是他的實例只能通過下面這種方式來獲取,直接實例化LocationManager是不被允許的。

Java代碼 複製代碼
  1. LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);  
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);



得到了LocationManager的實例locatonManager以後,我們通過下面的語句來註冊一個週期性的位置更新。

Java代碼 複製代碼
  1. locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,   
  2.  10000, locationListener);  
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
 1000, 0, locationListener);



這句代碼告訴系統,我們需要從GPS獲取位置信息,並且是每隔1000ms更新一次,並且不考慮位置的變化。最後一個參數是LocationListener的一個引用,我們必須要實現這個類。

Java代碼 複製代碼
  1. private final LocationListener locationListener = new LocationListener() {   
  2.     public void onLocationChanged(Location location) { //當座標改變時觸發此函數,如果Provider傳進相同的座標,它就不會被觸發   
  3.         // log it when the location changes   
  4.         if (location != null) {   
  5.             Log.i("SuperMap""Location changed : Lat: "  
  6.               + location.getLatitude() + " Lng: "  
  7.               + location.getLongitude());   
  8.         }   
  9.     }   
  10.   
  11.     public void onProviderDisabled(String provider) {   
  12.     // Provider被disable時觸發此函數,比如GPS被關閉   
  13.     }   
  14.   
  15.     public void onProviderEnabled(String provider) {   
  16.     //  Provider被enable時觸發此函數,比如GPS被打開   
  17.     }   
  18.   
  19.     public void onStatusChanged(String provider, int status, Bundle extras) {   
  20.     // Provider的轉態在可用、暫時不可用和無服務三個狀態直接切換時觸發此函數   
  21.     }   
  22. };  
private final LocationListener locationListener = new LocationListener() {
    public void onLocationChanged(Location location) { //當座標改變時觸發此函數,如果Provider傳進相同的座標,它就不會被觸發
        // log it when the location changes
        if (location != null) {
            Log.i("SuperMap", "Location changed : Lat: "
              + location.getLatitude() + " Lng: "
              + location.getLongitude());
        }
    }

    public void onProviderDisabled(String provider) {
    // Provider被disable時觸發此函數,比如GPS被關閉
    }

    public void onProviderEnabled(String provider) {
    //  Provider被enable時觸發此函數,比如GPS被打開
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {
    // Provider的轉態在可用、暫時不可用和無服務三個狀態直接切換時觸發此函數
    }
};



以上的這些步驟一般應當在Activity的onCreate()階段完成。

在成功註冊了一個週期性座標更新以後,我們就隨時可以通過下面的方法來取得當前的座標了。

Java代碼 複製代碼
  1. Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);   
  2. double latitude = location.getLatitude();     //經度   
  3. double longitude = location.getLongitude(); //緯度   
  4. double altitude =  location.getAltitude();     //海拔  
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
double latitude = location.getLatitude();     //經度
double longitude = location.getLongitude(); //緯度
double altitude =  location.getAltitude();     //海拔



不過這時候,如果你嘗試去運行這個LocationSample的話程序啓動時多半就會報錯,因爲我們沒有設置GPS相關的權限,解決方法也相當簡單,在AndroidManifest.xml中的block裏添加下面這句即可解決權限的問題。詳細的權限設置,請參考官方文檔docs/reference/android/Manifest.permission.html

Java代碼 複製代碼
  1. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />  
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />



如果是在模擬器中調試的話,我們有兩種方法來設置一個模擬的座標值,第一種是通過DDMS,我們可以在eclipse的ADT插件中使用這種方法,只要打開"Window" --&gt; "Show View" 中打開"Emulator Control" View即可看到如下的設置窗口,我們可以手動,或者通過KML和GPX文件來設置一個座標。

另一種方法是使用geo命令,我們需要telnet到本機的5554端口,然後在命令行下輸入類似於 geo fix -121.45356 46.51119 4392 這樣的命令,後面三個參數分別代表了經度、緯度和(可選的)海拔。


William Hua 原創, 歡迎光臨William Hua的blog

發佈了12 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章