web-dev-qa-db-fra.com

LocationManager.PROVIDERS_CHANGED_ACTION ne fonctionnera pas sur les API 26 et supérieures.

J'utilise le code suivant pour obtenir un événement d'activation/désactivation de l'emplacement.

<receiver
    Android:name=".receivers.GpsReceiver"
    Android:enabled="true">
    <intent-filter>
        <action Android:name="Android.location.PROVIDERS_CHANGED" />
        <category Android:name="Android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>

Je développe une application basée sur geofence. Sur la base de Ne réinscrivez les geofences que si nécessaire nous devons réenregistrer les geofences après que l'application ait reçu une alerte GEOFENCE_NOT_AVAILABLE. Cela se produit généralement après la désactivation de NLP (fournisseur d'emplacement réseau d'Android). 

En utilisant ce récepteur de diffusion, j'ai réenregistré les clôtures géographiques lorsque le fournisseur d'emplacement réseau d'Android est activé. 

Mais à partir du niveau 26 de l’API, ce récepteur de diffusion ne fonctionnera jamais. Voir Limites d’exécution en arrière-plan

Alors, comment puis-je accomplir la même tâche dans l’API 26 et supérieure? 

Note: Je dois ré-enregistrer les geofences même lorsque l'application est en arrière-plan. 

11
Gunaseelan

Vous pouvez passer à l’enregistrement dynamique de vos destinataires par Context.registerReceiver(), mais à mon humble avis, il n’existe aucun moyen fiable de les enregistrer «pour toujours», car le système va quand même mettre fin à votre processus à certaines conditions. 

Bien sûr, vous pouvez les ré-enregistrer en utilisant, par exemple, Récepteurs de radiodiffusion de la liste blanche , AlarmManager, JobScheduler etc. Mais ce n’est pas la meilleure solution en termes de consommation de batterie et d’autres ressources. En fait, c’est la raison pour laquelle Google a désactivé les diffusions implicites. 

Le problème est le suivant: en désactivant les émissions implicites dans Oreo, Google vous oblige à utiliser un type de travail récurrent pour effectuer des opérations de ce type. En conséquence, vous n'avez pas besoin d'écouter les mises à jour d'état du PNL, vous devez simplement définir vos clôtures géographiques avec GeofencingClient.addGeofences (si la PNL est activée) dans votre travail récurrent.

5
artkoenig

comme mentionné dans l'article que vous avez lié, il n'y a aucun moyen, sur l'API Android 26, d'écouter des émissions implicites telles que 

<action Android:name="Android.location.PROVIDERS_CHANGED" />

si l'application est tuée ou n'est pas en cours d'exécution en arrière-plan. La seule chose à faire est d’enregistrer le récepteur de radiodiffusion au moment de l’exécution, comme indiqué dans le Guide de migration .

Ce que j'ai fait est d'appeler registerReceiver dans la classe d'application dans onCreate et d'annuler son enregistrement dans onTerminate.

class MyApplication : Application() {
  private val gpsReceiver = MyBroadcastReceiver()

  override fun onCreate() {
    super.onCreate()
    registerReceiver(gpsReceiver, IntentFilter("Android.location.PROVIDERS_CHANGED"))
  }

  override fun onTerminate() {
    super.onTerminate()
    unregisterReceiver(gpsReceiver)
  }
}

J'espère que cela pourrait vous aider!

2
mlo

vous devriez peut-être essayer d'utiliser service d'arrière-plan et wakelock pour une longue exécution en arrière-plan lorsque l'application est fermée/arrêtée ou désactivée . ça marche pour moi :)

0
sirinan jirinsa