среда, 12 марта 2014 г.

Little Fluffy Location Library

Задался поиском энергосберегающей технологии фонового определения координат из сервиса и нашел небольшую библиотечку.
Вебсайт автора http://www.littlefluffytoys.mobi/

Энергосберегающее определение местоположения для Android, использующая при возможности Google Play Location.

Описание

Поместите эту небольшую библиотеку в ваше Android приложение, поправьте манифест, инициализируйте её в методе onCreate ... и пользуйтесь!


Обновления местоположения будут транслироваться в ваше приложение периодически, даже после перезагрузки телефона. И ваши пользователи не будут жаловаться о жоре батарейки.

Идеально подходит для виджетов, которым требуется периодическое обновление местоположения в фоновом режиме, и для приложений, которые должны выполнять какие-либо действия в определенном месте. Также хорошо подходит для приложений, которые делают что-то с текущей позицией периодически, например, чтобы получать обновления с серверов.

Базируется на принципах и использует адаптированный код из android-protips-location by Reto Meier, из его поста A Deep Dive Into Location.

Требуется Android 2.1 и выше. Лучше всего работает с 2.2 и выше.

Теперь, по возможности, работает с закрытым исходным кодом и авторскими правами Google Play Services (GMS) объединенного провайдера местонахождения. Если это не так (например, на Kindle Fire, Nokia X) используется Location API Android Open Source Project.

Библиотека работает с помощью пассивного Location Listener (возможно только с Android 2.2 и выше, именно поэтому она лучше всего работает с ним), который слушает обновления местоположения по запросу других приложений на вашем телефоне.

Наиболее точные данные о местоположении выполняются запросами для вашего приложения примерно каждые 15 минут. Если обновления данных о местоположении еще не были получены из другого приложения в течение часа, библиотека форсирует обновление данных своими средствами.

Особенности:

  • обновление местоположения примерно каждые 15 минут (если новые обновления данных о местоположении найдены)
  • если нет обновления данных о местоположении в течении часа, обновление происходит принудительно
  • по необходимости, при каждом обновлении данных о местоположении выполняется вещание
  • конфигурируемые частота регулярных трансляций (по умолчанию 15 минут) и принудительного обновления (по умолчанию - 60 минут)
  • принудительная функция обновления
  • возможность получить последнее известное положение
  • выбор наиболее точного провайдера местоположения из возможных
  • абстрагирует сложности Google Play Services по сравнению с Android Open Source
  • необязательный debug output

С чего начать

Для использования библиотеки, добавьте в ваш проект файл littlefluffylocationlibrary.jar как external JAR. В Eclipse, можно просто создать в проекте папку libs и положить файл туда, обновить проект, правым кликом на файле .jar выбрать в меню "Add to build path".
Далее, отредактируйте ваш файл manifest, добавив в него следующее:


 ...  
 <manifest {...}>  
 ...  
  <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />  
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />  
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />  
  <uses-feature android:name="android.hardware.location" android:required="true" />  
  <uses-feature android:name="android.hardware.location.gps" android:required="false" />  
  ...  
  <application {...}>  
   ...  
   <service android:name="com.littlefluffytoys.littlefluffylocationlibrary.LocationBroadcastService" />  
   <receiver android:name="com.littlefluffytoys.littlefluffylocationlibrary.StartupBroadcastReceiver" android:exported="true">  
    <intent-filter>  
     <action android:name="android.intent.action.BOOT_COMPLETED" />   
    </intent-filter>   
   </receiver>  
   <receiver android:name="com.littlefluffytoys.littlefluffylocationlibrary.PassiveLocationChangedReceiver" android:exported="true" />  
   ...  
   <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/>  
  </application>  
  ...  
 </manifest>  

Внутри метода OnCreate() поместите вызов
 LocationLibrary.initialiseLibrary (getBaseContext (), "com.your.package.name");   


заменив имя пакета на ваш. Здесь также нужно обрабатывать исключение UnsupportedOperationException который указывает, что устройство не имеет провайдеров местоположения.

Теперь мы готовы использовать библиотеку!


Приложение транслирует действие com.your.package.name.littlefluffylocationlibrary.LOCATION_CHANGED с сериализованным объектом типа LocationInfo от com.littlefluffytoys.littlefluffylocationlibrary.LocationInfo которые содержат параметры местоположения. Т.е. вы должны настроить broadcast receiver, который будет слушать это действие. Такая настройка выходит за рамки этой документации, но вы можете скачать пример приложения и посмотреть там как это сделать.

Дополнительная информация

Режим отладки


Отладка по умолчанию отключена, чтобы ее включить, добавьте при инициализации:
 LocationLibrary.showDebugOutput();  

LocationLibraryConstants

Здесь содержится несколько полезных констант и функций:
 public static final long DEFAULT_ALARM_FREQUENCY = AlarmManager.INTERVAL_FIFTEEN_MINUTES;  
 public static final int DEFAULT_MAXIMUM_LOCATION_AGE = (int) AlarmManager.INTERVAL_HOUR;  
 public static final String LOCATION_BROADCAST_EXTRA_LOCATIONINFO = "com.littlefluffytoys.littlefluffylocationlibrary.LocationInfo";  
 public static String getLocationChangedPeriodicBroadcastAction()...  
 public static String getLocationChangedTickerBroadcastAction()...  


Перегруженные методы initialiseLibrary

Вы можете использовать любой из перегруженных методов initialiseLibrary, если вам требуется тонкая настройка параметров. Например, во время тестирования, вы можете установить alarmFrequency 60000 (1 минута в миллисекундах ) и locationMaximumAge в 120000 ( 2 минуты в миллисекундах).

Следующие параметры доступны через различные методы:

alarmFrequency: Как часто транслировать обновление местоположения в миллисекундах, если оно было получено. Для энергосбережения батареи, это должно быть одним из доступных неточных интервалов повторяемости, распознаваемых AlarmManager.setInexactRepeating(int, long, long, PendingIntent). Вам не запрещается использовать любое другого значение, но в этом случае AlarmManager  Android, использует setRepeating вместо setInexactRepeating, и это приводит к ухудшению работы от батареи. По умолчанию используется AlarmManager.INTERVAL_FIFTEEN_MINUTES.

locationMaximumAge: Максимальный таймаут обновления местоположения. Если при срабатывании события местоположение старше этого возраста, будет произведено обновление местоположения. По умолчанию используется AlarmManager.INTERVAL_HOUR.

broadcastEveryLocationUpdate: Если параметр TRUE, в дополнение к трансляции периодических обновлений, передается информация о всех обновлениях местоположения, как он будет найден, используя интент com.your.package.name.littlefluffylocationlibrary.LOCATION_CHANGED_TICK. По умолчанию FALSE.

broadcastPrefix: Настоятельно рекомендуется обеспечить уникальное значение для этого параметра, например по имени вашего пакета. В более ранней версии Little Fluffy Location Library, broadcast, чтобы показать изменение местоположения всегда был тем же - в частности, com.littlefluffytoys.littlefluffylocationlibrary.LOCATION_CHANGED (и LOCATION_CHANGED_TICK , если broadcastEveryLocationUpdate TRUE ).  
 Это означает, что если несколько приложений с использованием библиотеки были установлены на устройстве, каждое приложение будет принимать broadcast, посланный любому из приложений. На момент написания статьи, очень популярное приложение Groupon использует библиотеку и отправляет эту постоянную трансляцию, так что это важный вопрос. Таким образом, для того, чтобы ваше приложение реагировало только на broadcast из вашего приложения, а не дублировало передачи из других приложений, пожалуйста, сделайте уникальное значение для этого параметра. Однако, если вы должны поддерживать обратную совместимость с предыдущей версией этой библиотеки , и вы по какой-то причине не в состоянии переработать свое приложение , просто используйте com.littlefluffytoys для этого параметра.

Доступ к последнему местоположению

Чтобы получить последнюю информацию о местоположении, не дожидаясь трансляции, просто создайте объект LocationInfo: 
 
 LocationInfo latestInfo = new LocationInfo(getBaseContext());  

Если у вас уже есть объект LocationInfo, просто вызовите метод refresh().

Форсирование получения местоположения

Для принудительного обновления местоположения, вызовите LocationLibrary.forceLocationUpdate(), и в ближайшее время вы получите трансляцию, содержащую последнее местоположение.
Отправить комментарий