編輯:關於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的,它接收的位置更新回調。
如果沒有這些權限,您的申請將請求位置更新時,在運行時失敗。...
圖1表示在其中應用程序監聽位置更新窗口的時間表。
這種模式的一個窗口,在此期間,位置更新接收幀很多,你需要你的應用程序添加基於位置的服務時作出的決定的。
決定什麼時候開始監聽更新
作為應用程序啟動時,或僅用戶激活某項功能後,您可能要立即開始監聽位置更新。要知道,監聽定位坐標長窗可以消耗大量的電池電量,但短期內可能不會允許足夠的精度。
如上所示,你可以開始通過調用requestLocationUpdates()監聽的更新:
String locationProvider = LocationManager.NETWORK_PROVIDER; // Or, use GPS location data: // String locationProvider = LocationManager.GPS_PROVIDER; locationManager.requestLocationUpdates(locationProvider, 0, 0, locationListener);掌握最後的已知位置的快速修復
String locationProvider = LocationManager.NETWORK_PROVIDER; // Or use LocationManager.GPS_PROVIDER Location lastKnownLocation = locationManager.getLastKnownLocation(locationProvider);決定何時停止監聽更新
// 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); }調整模式以節省電池和數據交換
圖2表示在其中獲得的用戶位置,並且當用戶消耗的當前位置收聽停止窗口的時間表。
此線與如何用戶位置的以前的模式中的代碼獲得(圖1)。為了獲得最佳的定位精度,您可以選擇開始監聽位置更新,當用戶開始創建內容或應用程序啟動,即使,然後停止監聽更新時的內容已准備好發布或記錄。您可能需要考慮創建內容的典型任務需要多長時間,並判斷此持續時間允許的位置估計的有效??收集。
幫助用戶就去哪決定
你可能會創建一個試圖為用戶提供了一組有關到哪裡選擇一個應用程序。例如,你希望提供附近的餐館,商店和娛樂場所以及根據用戶位置的變化建議的順序列表。
為了適應這樣的流程,你可以選擇:
當獲得新的最佳估計重新排列推薦
停止監聽更新,如果建議的順序有所企穩
這種模型在圖3中被可視化。
圖2表示在其中獲得的用戶位置,並且當用戶消耗的當前位置收聽停止窗口的時間表。
此線與如何用戶位置的以前的模式中的代碼獲得(圖1)。為了獲得最佳的定位精度,您可以選擇開始監聽位置更新,當用戶開始創建內容或應用程序啟動,即使,然後停止監聽更新時的內容已准備好發布或記錄。您可能需要考慮創建內容的典型任務需要多長時間,並判斷此持續時間允許的位置估計的有效??收集。
幫助用戶就去哪決定
你可能會創建一個試圖為用戶提供了一組有關到哪裡選擇一個應用程序。例如,你希望提供附近的餐館,商店和娛樂場所以及根據用戶位置的變化建議的順序列表。
為了適應這樣的流程,你可以選擇:
當獲得新的最佳估計重新排列推薦
停止監聽更新,如果建議的順序有所企穩
這種模型在圖3中被可視化。
telnet localhost
geo fix -121.45356 46.51119 4392地理NMEA發送NMEA 0183句。
geo nmea $GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E*62有關如何連接到模擬器控制台的信息,請參閱使用模擬器控制台。
Android PopupWindows使用,androidpopupwindow 源碼測試示例: package com.example.pop
菜鳥Android之路(上),菜鳥android之路自己為什麼要學android 本人作為應屆畢業生,自己進入社會前做過好多夢,可是呢,現實還是打敗了無邪!!面對社會的
[better practice系列]Android處理好activity正確情況下的生命周期和意外情況下的生命周期淺析 前言: Activity生命周期是每一個Andr
《Android源碼設計模式解析與實戰》讀書筆記(二十二) 第二十二章、享元模式 享元模式是結構型設計模式之一,是對對象池的一種實現。就像它的名字一樣,共享對象,避免重