it-swarm.com.de

In Oreo (8.0.0+) (API 26+): So erhalten Sie ein Update für Standortdienste, wenn sich die App im Hintergrund befindet oder beenden

In Android O (8.0.0+) (API 26+): So erhalten Sie ein Update für Standortdienste, wenn sich die App im Hintergrund befindet oder beendet wird. In der Android-App "Strava" (Verfügbar auf Play Store ) werden die Ortungsdienste ordnungsgemäß ausgeführt, wenn sich die App im Hintergrund befindet oder beendet wird. Ich muss die gleiche Funktionalität in meiner App erstellen. Wenn ich den Service mit beginne

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

Dann wird die onDestroy-Methode nach 10 Sekunden aufgerufen, wenn sich eine App im Leerlauf befindet (die App befindet sich im Hintergrund oder im Kill). Unten ist mein 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();
        }
    }
}

Jede Hilfe wäre dankbar.

12

Sie können eine der beiden folgenden Optionen oder eine Kombination aus beiden ausprobieren, die meine Probleme gelöst haben, wenn ich sie angetroffen habe.

Option 1

Damit die Standortaktualisierung im Hintergrund fortgesetzt werden kann, müssen Sie LocationServices API mit FusedLocationProviderClient wie beschrieben hier und hier in docs oder hier in CODEPATH verwenden.

Option 2

Wenn Sie die Android Oreo 8.0-Dokumentation irgendwo in here richtig gelesen hätten, wären Sie auf diese Lösung gestoßen.

Schritt 1: Stellen Sie sicher, dass Sie einen Dienst als Vordergrunddienst starten, wie im folgenden Code angegeben

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));
        }

Schritt 2: Verwenden Sie eine Benachrichtigung, um anzuzeigen, dass Ihr Dienst ausgeführt wird. Fügen Sie in onCreate der Servicemethode die folgende Codezeile hinzu.

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

Schritt 3: Entfernen Sie die notification, wenn der Dienst angehalten oder zerstört wird.

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

Ein Problem mit Option 2 besteht darin, dass die notification so lange angezeigt wird, bis Ihre GpsService auf allen Geräten läuft, die auf Android Oreo 8.0 laufen.

Ich bin mir sicher, dass diese beiden Optionen auch funktionieren, wenn sich die App im Hintergrund oder im Kill-Status befindet.

Ich hoffe, dass diese Lösung Ihr Problem lösen kann.

16
Amrut Bidri

Der Schlüssel zur Lösung dieses Problems scheint ein Benachrichtigungsgenerator zu sein. Der folgende Link beschreibt eine funktionierende Lösung besser als ich zusammenfassen kann:

https://hackernoon.com/Android-Standort-verfolgung-mit-a-service-80940218f561

0
Luke Dupin