星期五, 10月 14, 2011

Location and Maps (二)

Android應用程式

Obtaining User Location

知道用戶的位置,讓你的應用程式更加智慧,傳遞更多訊息給用戶,當為Android開發一個位置感知的應用程式,你可以採用GPS及Android的Network Location Provider獲得用戶位置,雖然GPS是最準確的,它只在戶外有用,消耗電力快速,無法如用戶預期快速地回應位置。Android的Network Location Provider利用手機信號塔和無線網路提供位置資訊,如此方式它能夠運行於室內及戶外,反應快速,消耗較少電力。在你的應用程式中獲得用戶位置,你可以採用GPS及Android的Network Location Provider,或是其一。


Challenges in Determining User Location

從移動裝置獲得用戶位置是複雜的,為什麼位置讀取有錯誤及不準確,以下有幾個原因:

  • 眾多的定位來源
    GPS、Cell-ID、Wi-Fi每個皆可提供線索給用戶,決定採用及信任哪一種,權衡自準確度、速度、電池的消耗。
  • 用戶移動
    因為用戶位置改變,你必須不斷地計算用戶的位置交待用戶移動。
  • 準確度不定
    來自每個位置來源的位置估計它們的準確度並不一致,10秒前在一個來源獲得的位置比起最新從其他來源或同一個來源更加準確。
這些問題使得獲得可靠的用戶讀取是困難的。


Requesting Location Updates

在解決上述定位錯誤之前,先介紹在Android平台上你如何取得用戶位置。

在Android上獲得用戶位置要藉著回調手段,你表示你要從LocationManager接收位置更新,呼叫requestLocationUpdates()傳入一個LocationListener,你的LocationListener必須呼叫許多回調方法,當用戶位置改變或是服務狀態改變時Location Manager呼叫這些方法。

舉例,以下程式碼顯示如何定義LocationListener及獲得位置更新。


// Acquire a reference to the system Location Manager
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() {
    public void onLocationChanged(Location location) {
      // Called when a new location is found by the network location provider.
      makeUseOfNewLocation(location);
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {}

    public void onProviderEnabled(String provider) {}

    public void onProviderDisabled(String provider) {}
  };
// Register the listener with the Location Manager to receive location updates
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

requestLocationUpdates()的第一個參數是採用哪一種定位提供器形式(此例,手機信號塔及無線網路的Network Location Provider),你可以利用第二及第三個參數控制你的監聽器接收更新的頻率,第二個是控制通知與通知之間的區段最小時間,第三個是控制通知與通知之間最小改變距離,兩個都設為0,表示盡可能獲得定位通知,第四個參數是LocationListener,接收位置更新的回調方法。

從GPS提供器獲得位置更新,GPS_PROVIDER替代NETWORK_PROVIDER,你也可以從GPS及Network Location Provider獲得位置更新,呼叫requestLocationUpdates()兩次,一次為NETWORK_PROVIDER,一次為GPS_PROVIDER。


Requesting User Permissions


為了從NETWORK_PROVIDER或GPS_PROVIDER接收位置更新,你必須獲得用戶權限,分別宣告ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION在Androidmanifest檔案中,例如:


<manifest ... >
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    ...</manifest>

沒有這個權限,你的應用程式在runtime要求位置更新會失敗。

沒有留言:

張貼留言