Android: LocationManager динамически регулирует пороги minTime / minDistance - PullRequest
8 голосов
/ 22 августа 2010

Это способ прослушивания обновлений местоположения GPS (используя LocationManager и LocationListener):

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

Но я бы хотел динамически настроить аргументы minTime и minDistanceиспользуется LocationManager#requestLocationUpdates.Моя цель - сэкономить заряд батареи в соответствии с несколькими правилами использования, а именно:

  • Если пользователь не перемещается, увеличьте minTime, чтобы получить обновление местоположения
  • Если пользователь перемещаетсяочень быстро, увеличьте minDistance
  • Если пользователь находится в помещении (без покрытия GPS), увеличьте оба
  • Если аккумулятор слишком низкий, увеличьте оба
  • ... (любая другая эвристика)

Я хотел бы знать:

  1. Действительно ли это хорошая идея для экономии заряда батареи?
  2. Как я могу это сделатькакие-то корректировки?Я могу позвонить и LocationManager#removeUpdates и LocationManager#requestLocationUpdates снова, если есть единственная альтернатива.
  3. Любая идея или пример кода, который вы знаете для реализации такого рода адаптивных алгоритмов?Редактировать: приложение представляет собой систему отслеживания, чтобы знать, где люди, чтобы назначить задачи человеку, ближайшему к заданному poing.На самом деле батарея вряд ли длится 8 часов, поэтому я хотел бы увеличить ее.

Ответы [ 3 ]

4 голосов
/ 22 августа 2010

AFAIK вам нужно позвонить removeUpdates и requestLocationUpdates снова.

Также вы можете посмотреть на другие способы, чтобы узнать, движется ли телефон вообще, например, на акселерометр. Прочитайте об этом здесь и см. Ответы на этот вопрос

Но чтобы дать вам больше идеи, вам нужно представить саму проблему. Не пытайтесь оптимизировать рано, пока у вас не возникнет проблема. Если у вас есть, вам нужно опубликовать детали об этом.

1 голос
/ 10 декабря 2012

Я сделал что-то вроде этого:

У меня был 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 (extends IntentService) запускаем обычный слушатель местоположения следующим образом:

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

Это позволяет мне сделать следующее:

  1. Если система получает какое-либо обновление местоположения до того, как alarmManager запустит ForceLocationService, она автоматически получит обновление и сбросит аварийный сигнал.

  2. Если до срабатывания будильника обновление не происходит, то срабатывает срабатывание будильника, что гарантирует получение обновления при необходимости.

Единственная проблема, с которой я столкнулся, это то, что она не работает, если нет изменений в местоположении, потому что сброс тревоги сделан в onLocationChanged ().

1 голос
/ 22 августа 2010

Это действительно хорошая идея для экономии заряда батареи?

Вероятно, нет. AFAIK, GPS-радио будет работать постоянно, и это самый большой заряд батареи из того, что вы описываете. Чтобы сэкономить заряд батареи, нужно удалить обновления, чтобы отключить GPS-радио. Однако в следующий раз, когда вы запросите обновления местоположения, GPS потребуется некоторое время, чтобы получить свое первоначальное исправление.

Если пользователь находится в помещении (без покрытия GPS), увеличьте оба значения

Если вы не можете починить GPS, выключите радио и повторите попытку через несколько минут (или на основании события пользовательского интерфейса или чего-то еще). Нет смысла оставлять GPS включенным, если он не приносит никакой пользы.

Если аккумулятор слишком низкий, увеличьте оба значения

Если аккумулятор слишком низкий, отключите GPS. Либо переключитесь на провайдера с низким энергопотреблением (используйте Criteria, чтобы найти его), либо используйте данные о местоположении. Пусть пользователь сам решает, что является «слишком низким», с помощью предпочтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...