Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android API Guides---Location Strategies

Android API Guides---Location Strategies

編輯:關於Android編程

Location Strategies

注:本指南中描述的策略適用於平台定位API中android.location。該谷歌位置服務API,谷歌Play的一部分服務,提供了更強大的,高層次的框架,自動處理位置提供者,用戶的移動和定位精度。它還可以處理基於功耗參數你提供位置更新的調度。在大多數情況下,你會得到更好的電池性能,以及更合適的准確性,使用位置服務API。
要了解更多有關位置服務API,請參閱谷歌Android位置服務。
了解用戶所在允許應用程序更聰明,給用戶提供更好的信息。在開發Android的位置感知應用程序,你可以利用GPS和Android的網絡位置提供商獲取用戶位置。雖然GPS是最精確的,它只能在戶外,它會迅速消耗電池電力,並且不盡快用戶希望返回的位置。 Android的網絡位置提供商決定使用手機信號塔和Wi-Fi信號,提供了在工作室內和室外的方式位置信息的用戶定位,響應速度更快,節省電池電量。要在應用程序獲取用戶的位置,可以使用GPS和網絡位置提供商,或者只是一個。
在確定用戶位置的挑戰
從移動設備獲取用戶位置可以是復雜的。有幾個原因的位置讀數(不論其來源)可以包含錯誤和不准確的。在用戶定位誤差的一些來源包括:
位置眾多來源
GPS,小區ID,和Wi-Fi可分別提供線索給用戶的位置。確定哪些使用和信任是在准確度,速度和電池效率的權衡的問題。
移動用戶
由於用戶位置的變化,必須重新估計用戶位置,每隔一段時間占移動。
不同精度
位置估計每個位置源未來不在其准確性是一致的。從一個來源獲得10秒前一個位置可能比從其他或同一源中的最新位置更加准確。
這些問題可以使它難以獲得可靠的用戶的位置的讀數。本文提供的信息,以幫助您應對這些挑戰,以獲得可靠的位置讀數。它還提供了可以在應用程序中使用,以提供一個准確,反應地理位置體驗用戶的想法。
請求位置更新
解決一些上述的定位誤差之前,這裡是介紹如何可以在Android上獲取用戶的位置。
在入門的Andr??oid用戶位置以回調的方式工作。您表明您想通過調用requestLocationUpdates()接收來自的LocationManager(“位置經理”)位置更新,傳遞一個LocationListener的。您LocationListener的必須實現幾個回調方法,該位置管理器調用時,用戶位置的變化或當服務的狀態發生變化。
例如,下面的代碼演示了如何定義一個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第一個參數()的位置提供者的類型使用(在這種情況下,手機信號塔和Wi-Fi的定位網絡位置提供商)。您可以控制??在該監聽器接收的第二和第三個參數,第二個更新的頻率是通知,三是介於兩者之間的距離最小的更改通知,同時設置為零請求位置通知之間的最短時間間隔盡可能頻繁地。最後一個參數是你的LocationListener的,它接收的位置更新回調。


來自GPS提供商,用於NETWORK_PROVIDER替代GPS_PROVIDER請求位置更新。您也可以要求從GPS,並通過調用requestLocationUpdates(網絡位置提供兩個位置更新)一次兩次NETWORK_PROVIDER和一次GPS_PROVIDER。


請求用戶權限


為了接收來自NETWORK_PROVIDER或GPS_PROVIDER位置更新,則必須分別宣布無論是ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION許可,在你的Andr??oid清單文件要求用戶權限。例如:

 

 


  
  ...
如果沒有這些權限,您的申請將請求位置更新時,在運行時失敗。


注意:如果您同時使用NETWORK_PROVIDER和GPS_PROVIDER,那麼你只需要請求ACCESS_FINE_LOCATION許可,因為它包括兩個供應商的許可。 (許可ACCESS_COARSE_LOCATION包括許可只針對NETWORK_PROVIDER)。


定義為最佳性能模型


基於位置的應用現在是普遍的,但由於在小於最佳精度,用戶運動,方法來獲取位置眾人和節省電池的願望,獲得用戶的位置是復雜的。為了克服獲得了良好的用戶位置,同時保持電池電量的障礙,你必須定義一個一致的模型,指定應用程序如何獲取用戶的位置。該模型包括當你開始和停止監聽更新以及何時使用緩存的位置數據。


流量獲取用戶位置


下面是用於獲得用戶位置的程序的典型的流程:


啟動應用程序。
一段時間後,開始監聽來自所需位置提供更新。
保持位置的通過過濾掉新的,但不太精確修復了“當前最佳估計數”。
停止監聽位置更新。
就拿最後的最佳位置估計的優勢。
圖1顯示在可視化中的應用正在監聽位置更新,在這段時間發生的事件期間時間表這種模式。

 

\

圖1表示在其中應用程序監聽位置更新窗口的時間表。


這種模式的一個窗口,在此期間,位置更新接收幀很多,你需要你的應用程序添加基於位置的服務時作出的決定的。


決定什麼時候開始監聽更新


作為應用程序啟動時,或僅用戶激活某項功能後,您可能要立即開始監聽位置更新。要知道,監聽定位坐標長窗可以消耗大量的電池電量,但短期內可能不會允許足夠的精度。


如上所示,你可以開始通過調用requestLocationUpdates()監聽的更新:

 

String locationProvider = LocationManager.NETWORK_PROVIDER;
// Or, use GPS location data:
// String locationProvider = LocationManager.GPS_PROVIDER;

locationManager.requestLocationUpdates(locationProvider, 0, 0, locationListener);
掌握最後的已知位置的快速修復


它需要你的位置監聽器來接收第一定位的時間往往過長用戶等待。直到一個更准確的位置提供給您的位置監聽器,你應該利用通過調用getLastKnownLocation(String)將緩存的位置:

 

 

String locationProvider = LocationManager.NETWORK_PROVIDER;
// Or use LocationManager.GPS_PROVIDER

Location lastKnownLocation = locationManager.getLastKnownLocation(locationProvider);
決定何時停止監聽更新


當新的修補程序是沒有必要的范圍可以是很簡單的判斷的邏輯非常復雜取決於你的應用程序。當的位置被獲得並在使用位置,提高了估計的准確性之間的短間隙。時時提防,聽久了會消耗大量的電池電量,所以只要你有你需要的,你應該通過調用removeUpdates(的PendingIntent)停止監聽更新的信息:

 

 

// Remove the listener you previously added
locationManager.removeUpdates(locationListener);
維護當前最佳估計數


你可能想到的是,最近的位置方位是最准確的。但是,由於位置坐標的精度變化,最新的修補並不總是最好的。你應該包括邏輯選擇基於幾個標准位置修正。標准還取決於應用和現場測試的用例。


在這裡,您可以采取驗證的位置坐標的精度幾個步驟:


檢查檢索到的位置比以前的估計顯著更新。
檢查由所在地聲稱精度比以前的估計更好或更壞。
檢查新的位置是從哪個供應商,並確定是否更信任它。
這種邏輯的一個精心制作的例子可以是這個樣子:

 

 

private static final int TWO_MINUTES = 1000 * 60 * 2;

/** Determines whether one Location reading is better than the current Location fix
 * @param location The new Location that you want to evaluate
 * @param currentBestLocation The current Location fix, to which you want to compare the new one
 */
protected boolean isBetterLocation(Location location, Location currentBestLocation) {
  if (currentBestLocation == null) {
    // A new location is always better than no location
    return true;
  }

  // Check whether the new location fix is newer or older
  long timeDelta = location.getTime() - currentBestLocation.getTime();
  boolean isSignificantlyNewer = timeDelta > TWO_MINUTES;
  boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES;
  boolean isNewer = timeDelta > 0;

  // If it's been more than two minutes since the current location, use the new location
  // because the user has likely moved
  if (isSignificantlyNewer) {
    return true;
  // If the new location is more than two minutes older, it must be worse
  } else if (isSignificantlyOlder) {
    return false;
  }

  // Check whether the new location fix is more or less accurate
  int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy());
  boolean isLessAccurate = accuracyDelta > 0;
  boolean isMoreAccurate = accuracyDelta < 0;
  boolean isSignificantlyLessAccurate = accuracyDelta > 200;

  // Check if the old and new location are from the same provider
  boolean isFromSameProvider = isSameProvider(location.getProvider(),
      currentBestLocation.getProvider());

  // Determine location quality using a combination of timeliness and accuracy
  if (isMoreAccurate) {
    return true;
  } else if (isNewer && !isLessAccurate) {
    return true;
  } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) {
    return true;
  }
  return false;
}

/** Checks whether two providers are the same */
private boolean isSameProvider(String provider1, String provider2) {
  if (provider1 == null) {
   return provider2 == null;
  }
  return provider1.equals(provider2);
}
調整模式以節省電池和數據交換


當你測試你的應用程序,你可能會發現,你提供良好的地理位置和良好的性能模型需要進行一些調整。這裡有一些事情你可能會改變在兩者之間找到一個很好的平衡。


縮小窗口的大小


在你聽的位置更新較小的窗口意味著GPS和網絡定位服務互動少,因此,保護??電池壽命。但它也允許較少的位置,從中選擇一個最佳估計。


設置位置提供經常更新的回報少


減少在該窗期間新更新出現也可以提高電池效率的速率,但在精度的成本。權衡的價值取決於你的應用程序是如何使用的。可以通過在requestLocationUpdates(增加的參數),該指定間隔時間和最小距離的變化減少更新的速率。


限制一組供應商


根據在使用你的應用環境或精度要求的水平,你可以選擇只使用網絡位置提供商或者只有GPS,而不是兩個。僅與服務之一相互作用減少了在准確的潛在成本的電池使用。


常見的應用案例


還有你可能想在你的應用程序獲取用戶位置的原因有很多。下面是在其中您可以使用用戶的位置來豐富您的應用程序一對夫婦的情景。每個方案還介紹了時,你應該開始和停止偵聽的位置,以獲得良好的閱讀,並幫助延長電池壽命的良好做法。


標記與位置用戶創建的內容


你可能會創造一個用戶創建的內容將被標上位置的應用程序。想想用戶分享他們的地方經驗,張貼審查餐廳,或者記錄一些內容,可以用自己的當前位置進行擴充。的這種相互作用可能如何發生的,相對於該位置的服務的模式,在圖2中可視化。

 

\

圖2表示在其中獲得的用戶位置,並且當用戶消耗的當前位置收聽停止窗口的時間表。


此線與如何用戶位置的以前的模式中的代碼獲得(圖1)。為了獲得最佳的定位精度,您可以選擇開始監聽位置更新,當用戶開始創建內容或應用程序啟動,即使,然後停止監聽更新時的內容已准備好發布或記錄。您可能需要考慮創建內容的典型任務需要多長時間,並判斷此持續時間允許的位置估計的有效??收集。


幫助用戶就去哪決定


你可能會創建一個試圖為用戶提供了一組有關到哪裡選擇一個應用程序。例如,你希望提供附近的餐館,商店和娛樂場所以及根據用戶位置的變化建議的順序列表。


為了適應這樣的流程,你可以選擇:


當獲得新的最佳估計重新排列推薦
停止監聽更新,如果建議的順序有所企穩
這種模型在圖3中被可視化。

\

圖2表示在其中獲得的用戶位置,並且當用戶消耗的當前位置收聽停止窗口的時間表。


此線與如何用戶位置的以前的模式中的代碼獲得(圖1)。為了獲得最佳的定位精度,您可以選擇開始監聽位置更新,當用戶開始創建內容或應用程序啟動,即使,然後停止監聽更新時的內容已准備好發布或記錄。您可能需要考慮創建內容的典型任務需要多長時間,並判斷此持續時間允許的位置估計的有效??收集。


幫助用戶就去哪決定


你可能會創建一個試圖為用戶提供了一組有關到哪裡選擇一個應用程序。例如,你希望提供附近的餐館,商店和娛樂場所以及根據用戶位置的變化建議的順序列表。


為了適應這樣的流程,你可以選擇:


當獲得新的最佳估計重新排列推薦
停止監聽更新,如果建議的順序有所企穩
這種模型在圖3中被可視化。

 

telnet localhost 
發送位置數據:
地緣固定到發一組固定地理位置。
這個命令接受一個經度和十進制度緯度和米可選高度。 例如:

 

 

geo fix -121.45356 46.51119 4392
地理NMEA發送NMEA 0183句。
這個命令接受類型'$ GPGGA'(修正數據)或“$ GPRMC”(發送數據)的單一NMEA句子。 例如:

 

 

geo nmea $GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E*62
有關如何連接到模擬器控制台的信息,請參閱使用模擬器控制台。   
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved