web-dev-qa-db-fra.com

Dans Oreo (8.0.0+) (API 26+), Comment obtenir une mise à jour de services de localisation lorsque l'application est en arrière-plan ou tuer

Dans Android O (8.0.0+) (API 26+), Comment obtenir une mise à jour de services de localisation lorsque l'application est en arrière-plan ou en mode mort? Dans l'application Android "Strava" (disponible sur Play Store ), les services de localisation s'exécutent correctement lorsque l'application est en arrière-plan ou qu'elle est inactive. Je dois créer la même fonctionnalité dans mon application . Chaque fois que je lance le service en utilisant

startService(new Intent(this, GpsServices.class));

Ensuite, la méthode onDestroy est appelée après 10 secondes lorsqu'une application est en mode inactif (l'application est en arrière-plan ou kill). Ci-dessous mon code.

public class GpsServices extends Service implements LocationListener, Listener {

    @Override
    public void onCreate() {
        mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        if (mLocationManager != null) {
            mLocationManager.addGpsStatusListener(this);
        }
        if (mLocationManager != null) {
            mLocationManager.requestLocationUpdates(
                LocationManager.GPS_PROVIDER,
                500,
                0,
                this);
        }    
    }

    public void onLocationChanged(Location location) {
        System.out.println("location = [" + location + "]");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // If we get killed, after returning from here, restart
        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        // We don't provide binding, so return null
        return null;
    }

    /* Remove the locationlistener updates when Services is stopped */
    @Override
    public void onDestroy() {
        try {
            mLocationManager.removeUpdates(this);
            mLocationManager.removeGpsStatusListener(this);
            stopForeground(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Toute aide serait appréciée.

12
ketan dhopeshwarkar

Vous pouvez essayer l'une des deux options ci-dessous ou une combinaison des deux, ce qui a résolu mes problèmes quand je les ai affrontés.

Option 1

Pour que la mise à jour de l'emplacement continue de fonctionner en arrière-plan, vous devez utiliser LocationServices API avec FusedLocationProviderClient comme décrit ici et ici dans docs ou ici dans CODEPATH.

Option 2

Si vous aviez correctement lu la documentation Android Oreo 8.0 quelque part dans ici , vous auriez atterri sur cette solution.

Étape 1: Assurez-vous de démarrer un service en tant que service de premier plan, comme indiqué dans le code ci-dessous.

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {

            mainActivity.startService(new Intent(getContext(), GpsServices.class));
            mainActivity.startService(new Intent(getContext(), BluetoothService.class));
            mainActivity.startService(new Intent(getContext(), BackgroundApiService.class));
        }
        else {
            mainActivity.startForegroundService(new Intent(getContext(), GpsServices.class));
            mainActivity.startForegroundService(new Intent(getContext(), BluetoothService.class));
            mainActivity.startForegroundService(new Intent(getContext(), BackgroundApiService.class));
        }

Étape 2: Utilisez la notification pour indiquer que votre service est en cours d'exécution. Ajouter la ligne de code ci-dessous dans la méthode de service onCreate.

@Override
public void onCreate() {
    ...
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        startForeground(NOTIFICATION_ID, notification);
    }
    ...
}

Étape 3: Supprimez la notification lorsque le service est arrêté ou détruit.

@Override
public void onDestroy() {
    ...
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
          stopForeground(true); //true will remove notification
    }
    ...
}

Un problème avec Option 2 est qu'il continue d'afficher la notification jusqu'à ce que votre GpsService s'exécute sur tous les périphériques fonctionnant sous Android Oreo 8.0.

Je suis sûr que ces deux options fonctionneront même lorsque l'application est en arrière-plan ou en mode kill.

J'espère que cette solution pourra résoudre votre problème.

16
Amrut Bidri

La solution pour résoudre ce problème semble être un générateur de notification. Le lien suivant décrit une solution qui fonctionne mieux que je ne peux en résumer:

https://hackernoon.com/Android-location-tracking-with-a-service-80940218f561

0
Luke Dupin