2015-05-26 3 views
9

Я работаю над библиотекой, которая может использоваться для мониторинга геофонов на устройствах Android. Я заметил, что геолокации, которые я регистрирую в Google Apps Location GeofencingApi, теряются после того, как я отключил и снова включил службы геопозиционирования в настройках устройства.Настройки мониторинга местоположения в библиотеке

Я видел folks, предлагая мне зарегистрироваться на приемник android.location.PROVIDERS_CHANGED в моем AndroidManifest.xml файле. Я сделал это, но этот широковещательный приемник вызван только при добавлении и удалении поставщиков тестов в моем тестовом приложении. Я не получаю его вообще при переключении служб местоположения в настройках устройства.

Я делаю что-то неправильно? Кто-нибудь знает, как надежно определить, когда пользователь переключает службы местоположения в настройки устройства? Я хотел бы видеть эти события в фоновом режиме, даже если мое приложение не работает.

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

Если это помогает, я тестирую Moto G под управлением Android 4.4.2. До сих пор все, что я делал с помощью геообъективов, отлично работает.

EDIT: После проведения большего исследования я обнаружил, что поведение трансляции PROVIDERS_CHANGED сильно варьируется в зависимости от версии телефона и модели. Мой Nexus 5 работает под управлением Android 5.1, кажется, работает нормально на самом деле - я могу регулярно получать трансляцию PROVIDERS_CHANGED. У меня также есть Moto G и Moto X, работающие на 4.4.x, и они никогда не выпускали для меня PROVIDERS_CHANGED. Samsung Galaxy S3 на Android 4.2 произведет трансляцию для меня, но перестанет ее выполнять после того, как я использовал свою активность в Map с поставщиками тестовых местоположений.

В любом случае, я решил прекратить заниматься этой проблемой пока. Я думаю, что Android просто глючит.

+0

Это может быть полезно http://stackoverflow.com/questions/10311834/how-to-check-if-location-services-are-enabled Также вы попытались, возможно, сохранить данные геозонности локально или где-то еще, чтобы предотвратить это от удаления? –

+0

Я уже сохраняю геолокации локально, поэтому я не буду терять их навсегда (если пользователь не очистит кеш). Это не моя проблема. Моя проблема в том, что я не получаю событие, уведомляет меня о том, что настройки поставщика местоположения изменились. (то есть: мне не сообщают, что они были удалены ОС, и мне не сообщают, когда я могу перезагрузить). –

+1

http://stackoverflow.com/questions/25156977/google-location-services-vs-android-location-services/25160005#25160005 Я регистрируюсь для поставщиков_changed в коде. На самом деле вам нужен код, чтобы получить достойный ответ. IDK с 4.4.2, возможно, он не работает. Через несколько месяцев я не активировал среду Android. – danny117

ответ

7

Трудно сказать, не видя ваш код, если вы делаете что-то не так, но я просто получил простой пример, который работал и тестировался с помощью кода от here в качестве руководства и адаптировал его для использования BroadcastReceiver в библиотеке.

Обратите внимание: приложение, использующее библиотеку, должно иметь receiver в своем AndroidManifest.xml. См. here и here, оба содержат информацию от @CommonsWare.

Добавление цитаты здесь только в том случае, связь идет плохо:

Есть ли способ для библиотечного проекта самостоятельно зарегистрировать для приемника в его собственном файле манифеста?

Не в настоящее время.

Итак, для любого приложения, использующего вашу библиотеку, необходимо будет добавить receiver в свой AndroidManifest.xml.

Обратите внимание, что это было протестировано на Android 4.4.4 на Samsung S4.

Я получил эту работу с помощью BroadcastReceiver в проекте библиотеки, составленном на aar.

Используя receiver элемента создан в AndroidManifest.xml основного приложения, что ссылки на BroadcastReceiver в библиотеке, я был в состоянии получить событие, когда какие-либо изменения в настройки Location:

  • Расположение тумблер на
  • Место переключения от
  • Изменение режима Высокая точность
  • Изменить местоположение Режим для эНЕРГОСБЕРЕЖЕНИЯ
  • Изменение режима местоположения только на GPS

Каждый раз, когда в настройках местоположения происходит изменение, BroadcastReceiver в библиотеке запускается, даже если приложение не работает.

Я использовал простой тест, в котором BroadcastReceiver в библиотеке отображается сообщение Toast каждый раз при изменении настроек местоположения.

Вот LocationProviderChangedReceiver.java в проекте библиотеки:

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.location.LocationManager; 
import android.util.Log; 
import android.widget.Toast; 

public class LocationProviderChangedReceiver extends BroadcastReceiver { 
    private final static String TAG = "LocationProviderChanged"; 

    boolean isGpsEnabled; 
    boolean isNetworkEnabled; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().matches("android.location.PROVIDERS_CHANGED")) 
     { 
      Log.i(TAG, "Location Providers changed"); 

      LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 
      isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 
      isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

      Toast.makeText(context, "GPS Enabled: " + isGpsEnabled + " Network Location Enabled: " + isNetworkEnabled, Toast.LENGTH_LONG).show(); 
     } 
    } 

} 

Затем в главном приложении, я положил скомпилированный myLibrary.aar в папке Libs, и настроить build.gradle скомпилировать AAR:

repositories{ 
     flatDir{ 
      dirs 'libs' 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile "com.android.support:appcompat-v7:22.1.1" 
    compile "com.google.android.gms:play-services:7.3.0" 

    compile 'com.mylibrary.daniel:mylibrary:[email protected]' 

} 

Настройте receiver в AndroidManifest.xml главного приложения:

<receiver 
     android:name="com.mylibrary.daniel.mylibrary.LocationProviderChangedReceiver" 
     android:exported="false" > 
     <intent-filter> 
      <action android:name="android.location.PROVIDERS_CHANGED" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </receiver> 

Затем установили приложение и изменили настройки местоположения несколькими способами. BroadcastReceiver в библиотеке была спровоцирована каждый раз:

enter image description here

enter image description here

enter image description here

enter image description here

+0

Спасибо за ваш ответ. Мой код в основном был таким же, как ваш. Я попробовал поставить свой BroadcastReceiver как в моем основном приложении, так и в моей библиотеке, и поведение такое же.Я могу регулярно получать трансляцию на своем Nexus 5 независимо от того, есть ли BroadcastReceiver в библиотеке или приложении. Я думаю, что до тех пор, пока я объявляю свой BroadcastReceiver в файле AndroidManifest.xml моей библиотеки, и я использовал Gradle для выполнения своих построений, неважно, где находится BroadcastReceiver. Другие телефоны гораздо менее надежны. Я думаю, что Android просто глючит, и я перестала работать над этой проблемой сейчас. –

+0

Да, это работает, когда приложение находится вокруг, но когда он убит/закрыт из диспетчера задач, он не работает для меня. Я использую Android 4.4.4 Kitkat на устройстве MI3. –

0

На самом деле, вы можете использовать location.MODE_CHANGED, а затем зарегистрировать приемник для приема вещания из его

<receiver android:name=".Receivers.LocationModeReceiver"> 
    <intent-filter> 
     <action android:name="android.location.MODE_CHANGED" /> 
    </intent-filter> 
</receiver> 
Смежные вопросы