2010-08-22 51 views
8

這是我聽GPS位置更新的方法(使用LocationManagerLocationListener):安卓的LocationManager動態調整minTime/minDistance纔會閾值

locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
listener = new MyLocationistener(); // LocationListener 
locationManager.requestLocationUpdates(
     LocationManager.GPS_PROVIDER, 
     30000, // milliseconds (minTime) 
     20, // meters (minDistance) 
     listener); 

但我想動態調整使用的minTimeminDistance參數通過LocationManager#requestLocationUpdates。我的目的是爲了節省電池,根據幾個使用策略,即:

  • 如果用戶不移動,增加minTime獲得位置更新
  • 如果用戶移動速度非常快,增加minDistance纔會
  • 如果用戶是在室內(無GPS覆蓋),同時增加
  • 如果電池電量過低,同時增加
  • ...(任何其他啓發式)

我想知道:

  1. 這對於節省電池壽命真的是個好主意嗎?
  2. 我該怎麼做這種調整?如果有唯一的選擇,我可以再次撥打LocationManager#removeUpdatesLocationManager#requestLocationUpdates
  3. 你知道實現這種自適應算法的任何想法或示例代碼?

編輯:該應用程序是一個跟蹤系統,知道人在哪裏,以便將任務分配給最接近給定位置的人。實際上電池幾乎不會持續8個小時,所以我想增加它。

+0

有趣的問題,雖然我不能幫助太多。我認爲節省電池是個好主意。我傾向於說,你建議的解決方案是唯一的解決方案,但我不是位置API的專家,所以我會讓別人發言。 – Sephy 2010-08-22 12:12:26

+0

[我已經使用了相同的代碼在我的應用程序,但它一點兒也不返回任何值,想知道如果任何玉傢伙能幫助我...] [1] [1]:HTTP: //stackoverflow.com/questions/9514980/android-getting-speed-with-gps – 2012-03-02 04:33:10

+0

刪除並添加,就像這樣:https://stackoverflow.com/questions/5385094/change-mintime-for-gps-locationlistener-動態 – jp1017 2016-11-01 03:23:44

回答

4

AFAIK您需要再次撥打removeUpdatesrequestLocationUpdates

此外,您還可以通過其他方式查看手機是否正在移動,如加速度計。閱讀關於它heresee this other question's answers

但是,給你更多的想法,你需要提出問題本身。不要試圖儘早優化,直到你沒有問題。如果你需要發佈有關它的詳細信息。

+0

謝謝。這是一個內部應用程序,用戶幾乎沒有技術技能,所以他們不知道什麼是GPS,並強制他們改變設置或開關GPA無線電有可用性問題。電池現在持續8-10小時,我們需要將其延長至少12小時。 – 2010-09-13 06:49:08

1

這是節省電池壽命的好主意嗎?

可能不是。 AFAIK,GPS收音機將一直處於工作狀態,這是你描述的最大的電池消耗。節省電池的方法是取消更新,以便GPS無線電關閉。但是,下次您請求位置更新時,GPS需要一段時間才能獲得其初始修復。

如果用戶是在室內(無GPS覆蓋),同時增加

如果無法獲得GPS定位,關閉收音機,以及稍後再試分鐘的一些號碼(或基於UI事件或其他)。如果它對你沒有任何好處,沒有任何理由離開GPS。

如果電池電量過低,同時增加

如果電池電量過低,關閉GPS。要麼切換到低功耗提供商(使用Criteria找到一個),要麼沒有位置數據。讓用戶通過偏好來決定什麼是「太低」。

+0

謝謝。你認爲什麼時候保持GPS無線電更好?(比再次關閉GPS更好)。秒,分鐘?我的意思是,也許如果我需要每30秒鐘修復一次,最好保持它,但如果您需要每5分鐘修復一次,則不會這樣。 – 2010-08-22 14:07:34

+1

您無法以編程方式切換GPS,您的用戶需要爲您開機。您可以只顯示設置屏幕。 – Pentium10 2010-08-22 18:39:09

+0

爲了回答您需要輪詢數據的頻率,請提供更多詳細信息。比如你使用位置數據是什麼? – Pentium10 2010-08-22 18:40:23

1

我做了這樣的事情:

我有一個LocationService(擴展Service並實現LocationListener)。我加入

locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 1, 1, this); 

,並在onLocationChangedListener:

public void onLocationChanged(Location location) { 
     AlarmManager aleManager = (AlarmManager) LocationService.context.getSystemService(ALARM_SERVICE); 
//Change the values of MINIMIUM_TRIGGER_TIME and INTERVAL_TIME 
     Intent forceLoc = new Intent(LocationService.context, 
       ForceLocationService.class); 
     PendingIntent pendingForceLoc = PendingIntent.getService(
       LocationService.context, 0, forceLoc, 
       PendingIntent.FLAG_ONE_SHOT); 
     // CANCEL PREVIOUS alarm and set new one 
     aleManager.cancel(pendingForceLoc); 
     aleManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, 
       MINIMIUM_TRIGGER_TIME, INTERVAL_TIME, pendingForceLoc); 
    } 

,並在ForceLocationService(擴展IntentService)觸發的常規位置監聽器是這樣的:

locMan=(LocationManager)getSystemService(LOCATION_SERVICE); 
locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1, 1, locationService); 

這讓我做的以下:

  1. 如果系統在alarmManager觸發ForceLocationService之前獲取任何位置更新,它會自動獲取更新並重置警報。

  2. 如果在警報觸發之前它沒有得到更新,那麼它會強制觸發警報,從而確保在需要時獲得更新。

我唯一的問題是,如果位置沒有變化導致警報重置在onLocationChanged()中完成,它將不起作用。