locationManager onLocationChanged wird nicht mehr ausgeführt

  • Antworten:31
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 106

07.04.2020, 14:29:23 via Website

Hallo zusammen,
ich habe folgendes Problem. Seit Android 10 scheint das GPS Tracking nicht mehr zu funktionieren.
Unter 9 ging noch alles wunderbar. Ich habe gesehen, dass bei der Einstellung der App nach der Installation bei der Berechtigung Standort folgendes dran steht "Nur während die App verwendet wird". Was heißt das genau? Nur wenn das Activity sichtbar ist?
Kann man das ihrgend wie ändern? haben sich das die Restriktionen von 9 auf 10 geändert?

danke und Grüße

Diskutiere mit!
  • Forum-Beiträge: 61

07.04.2020, 14:44:51 via Website

Hey,

Öffnen Sie auf Ihrem Smartphone die Einstellungen.
Tippen Sie auf Standort und dann App-Berechtigung.
Falls "Standort" nicht angezeigt wird, tippen Sie auf Sicherheit & Standort und dann Standort.
Wenn Sie ein Arbeitsprofil haben, tippen Sie auf Erweitert und dann Standort.
Sehen Sie sich unter "Immer zugelassen" und "Zugriff nur während Nutzung zugelassen" die Apps an, die auf den Standort Ihres Smartphones zugreifen dürfen.
Wenn Sie die Berechtigungen einer App ändern möchten, tippen Sie darauf und wählen Sie dann den entsprechenden Standortzugriff für die App aus.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 106

07.04.2020, 14:49:17 via Website

Hallo,

ja klar, das ist ja genau da wo ich das "Nur während die App verwendet wird" sehe!
Meine Frage was heißt das genau? Nur wenn das Activity sichtbar ist?
Kann man das ihrgend wie ändern? haben sich das die Restriktionen von 9 auf 10 geändert?

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 11.012

07.04.2020, 15:35:04 via Website

Was heißt "Seit Android 10 scheint das GPS Tracking nicht mehr zu funktionieren. "?

Bekommst du Fehlermeldungen?
Wird dein onLocationChange Listener nicht mehr aufgerufen?
Wie äußert sich das alles?

Du musst uns schon genaueres sagen, wie deine App funktioniert.
Lesenswert ist auch folgendes: https://proandroiddev.com/android-q-privacy-changes-for-accessing-device-location-1c8e2197d0e2

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 106

08.04.2020, 08:11:52 via Website

Guten Morgen Pascal,

ja sorry, ich war gestern etwas kurz angebunden!
Klar, ich erkläre mal im Detail.

Ich starte durch einen BroadcastReceiver einen Service bei Neustart. Der Service wiederum ruft in der onStartCommand die MainAcitivity durch ein Ident auf:

Intent i = new Intent();
i.setClassName("com.myapp", "com.myapp.MainActivity");
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);

In der onCreate Methode der MainAcitivity starte ich das GPS Tracking setzte aber vorher das Acitivity auf moveTaskToBack(true). Dazu habe ich eine Klasse von LocationListener die über die MainAcitivity gestartet wird mit:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 28000, 80, locationListener);

die Application fängt auch kurzzeitig an GPS Daten zu finden. Hört dann auf.

Ich habe mir den Link mal angeschaut und habe dazu Fragen.
So wie ich das lese muss ich auf jedenfall die Berechtigung ACCESS_BACKGROUND_LOCATION hinzufügen, wenn ich bei API level 29 bin.
Für mich stellt sich eine generelle Frage wo ich mir bisher noch keine Gedanken gemacht haben. Mir ist das nur aufgefallen, weil ich aktuell ein Handy hier liegen habe mit Android Version 10. Diese ganzen Regularien, wie der Einschränkung bei Standort beim Schreiben von Daten in eine Datei, die mit Android Version 10 kommen sind die auch gültig für Apps mit targetSdkVersion < 29. D.h. Wenn ich jetzt in meiner App bei der targetSdkVersion 28 in der build.grandle hinterlege haben ich dann evtl. das Problem dann auch noch? Verstehst du was ich meine?

Dank dir für deine Unterstützung.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 11.012

08.04.2020, 09:41:39 via Website

Das ist schon sehr komisch. Aber da fällt mir aktuell auch nichts ein.
Am besten gründlich Debuggen und Logs anschauen oder wenn du nach x Zeit kein Wert bekommen hast, einfach den LocationManager nochmals initialisiieren bzw. locationUpdates anfordern.

Wenn du in deiner App targetSdk 28 hinterlegt hast, dann werden die neuen Einschränkungen in Android 10 trotzdem greifen. Nur du wirst unter SDK 28 nicht die Möglichkeit haben, dann entsprechend zu handeln.
Von dem her bringt dir das keinen Vorteil auf SDK 28 zu gehen.
Die Funktionen werden damit auch nicht funktionieren.

Aber: Da du ja kurzzeitig LocationUpdates erhälst istz das keine Sache mit den Berechtigungen.

Ich denke eher dass es mit dem moveTaskToBack zutun hat.
Denn:

Navigate from this activity to the activity specified by upIntent,
finishing this activity in the process

https://developer.android.com/reference/android/app/Activity#moveTaskToBack(boolean)

Dabei wird die Activity beendet, das willst du eigentlich nicht.
Nimm das mal testweise raus und schau was passiert.

Wenn du das komplett im Hintergrund machen willst, muss dein Service das direkt ohne Activity machen, also als BackgroundService,

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 1.217

08.04.2020, 10:22:20 via Website

Hallo
Ich verstehe das Thema so ab API 28.

Zugriff auf GPS oder auch die Camera nicht ohne wissen des Users im Hinderrund.

In der Activity wo du die Permission geholt hast geht es.

Neu ist in einen Service musst du die Permission auch abfragen holen anfordern aber in der Activty und an den Service weitereichen.

Zum Thema Hinderrund Service da gibst es nur noch einen Forderrund Service mit Benachrichtigung an den User in der Status Zeile. Sonst wird der Service vom System beendet wenn es denkt.

Solange die Activiy gestartet ist hast du auch die Permission im Service . Ist die Activty beendet nicht mehr.
Ohne sie im Service sie abzufagen.

Das ist bei der Kamera genau so.

Wenn du das komplett im Hintergrund machen willst, muss dein Service das direkt ohne Activity machen, also als BackgroundService,

wird nicht gehn denn eine permission abfrage im service ja, aber das anfordern beim User geht nur in einer Activity nicht im Service.

— geändert am 08.04.2020, 10:28:10

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 11.012

08.04.2020, 10:31:26 via Website

@Jockel: Ja das ist klar, Permissions anfordern in der Activity aber LocationUpdates im Service, so meinte ich das.

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 1.217

08.04.2020, 11:02:39 via Website

Dann Erstelle mal einen camera manager in einem service. Und versuche sie zu öffnen.
Da will as das du dort eine Abfrage machst auch wenn du die permission in der activity schon hast.

— geändert am 08.04.2020, 11:10:15

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 106

08.04.2020, 18:27:39 via Website

Hallo zusammen,

ich hatte heute Morgen noch folgendes Probiert.

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 3, locationListener);

damit ich testen kann. Das hat super funktioniert. Ich hab mich nicht bewegt, aber er hat Daten getrackt. Hab dabei mal das Display ausgemacht gewartet oder mal neu gestartet. hat wunderbar funktioniert. dann habe ich es wieder auf

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 28000, 80, locationListener);

gestellt und dann bin ich drei Stunden Später weggefahren und wollte testen und siehe da. Es geht nicht mehr.

Laut den Entwickleroptionen und aktive Dienste läuft der GPS Dienst.

Ich verstehe es nicht. Werde Morgen das gleiche noch einmal machen mit den verringerten Werten.

Ihr schreibt Berechtigung anfordern. Klar ich kann das normalerweise direkt über die App machen, idem ich das beim User abfrage. Das ist doch das Gleiche wie wenn ich in den App-Infos unter Berechtigung gehe und dort unter Standort und dann "immer zulassen" wähle, oder?

Ihr merkt ich bin da noch nicht so Fit drin :-)

Danke

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 1.217

08.04.2020, 19:03:26 via Website

Hallo mich würde mal interessieren wie dein Service den du im hintergrund laufen lässt ausschaut.

Ich würde mal testen ob der Service über einen längeren Zeitraum läuft.
Dazu würde ich Daten in eine Datei schreiben die sich im App speichernbereich ohne premision ist.

Benutze dazu einfach die System Zeit in eine text datei. Dann wirst du sehen ob er auch läuft.

Ab Android 8 läuft ein einfacher services nicht weiter im hindergrund.

Wann das System den service stoppt ist schwer vorhersehbar sicher ist das es das macht. Außer einen fordregrund Service, mit notification.

Das mit den permission in der App und das activiren im Menü ist für mich nicht das selbe für das System bestimmt auch nicht.

— geändert am 08.04.2020, 19:59:51

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 106

08.04.2020, 20:03:16 via Website

Hier der Service:

    public class EndlessService extends Service
    {
    private boolean isServiceStarted = false;

    public IBinder onBind(Intent intent)
    {
        return null;
    }

    public int onStartCommand(Intent intent, int flags, int startId)
    {
        super.onStartCommand(intent, flags, startId);

        if (this.isServiceStarted)
        {
            Log.i(this.getClass().getSimpleName(), "App Service bereits gestartet!");
        }
        else
        {
            this.startGPSTracking();

            Log.i(this.getClass().getSimpleName(), "App Service ist gestartet!");

            this.isServiceStarted = true;
        }

        // by returning this we make sure the service is restarted if the system kills the service
        return START_STICKY;
    }

    public void onCreate(){
        super.onCreate();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            Notification notification = createNotification();
            startForeground(10, notification);
        }
        else
        {
            Intent endlessServiceIntent = new Intent(getApplicationContext(), EndlessService.class);

            if(endlessServiceIntent != null)
            {
                Notification notification = createNotificationSmaler26Mode();
                startForeground(10, notification);
            }
        }
    }

    /**
     *
     */
    public void onDestroy()
    {
        super.onDestroy();

        Log.i(this.getClass().getSimpleName(), "App Service wurde beendet - Destroy".toUpperCase());
    }


    private Notification createNotification()
    {
        String notificationChannelId = "ENDLESS SERVICE CHANNEL";
        Notification newMessageNotification = null;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationManager notificationManager = getSystemService(NotificationManager.class);

            NotificationChannel serviceChannel = new NotificationChannel(
                    notificationChannelId,
                    "Notification",
                    NotificationManager.IMPORTANCE_HIGH
            );

            serviceChannel.setDescription("Notification");
            serviceChannel.enableLights(false);
            serviceChannel.setLightColor(Color.RED);
            serviceChannel.enableVibration(false);
            long a[] = {100, 200, 300, 400, 500, 400, 300, 200, 400};
            serviceChannel.setVibrationPattern(a);


            notificationManager.createNotificationChannel(serviceChannel);

            Intent notificationIntent = new Intent(getApplicationContext(), MainActivity.class);

            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

            newMessageNotification = new Notification.Builder(this, notificationChannelId)
                    .setContentTitle("Notifications")
                    .setContentText("Notifications")
                    .setContentIntent(pendingIntent)
                    .setTicker("")
                    .setPriority(Notification.PRIORITY_HIGH) 
                    .build();

        }

        return newMessageNotification;
    }

    /**
     *
     * @return
     */
    private Notification createNotificationSmaler26Mode()
    {
        Intent notificationIntent = new Intent(getApplicationContext(), MainActivity.class);

        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

        Notification noti = new Notification.Builder(getApplicationContext())
                .setContentTitle("Notifications")
                .setContentText("Notifications")
                .setContentIntent(pendingIntent)
                .build();

        return noti;
    }

    /**
     *
     */
    public void startGPSTracking()
    {
        APPLocationListener appLocationListener = new APPLocationListener(getBaseContext());

        LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        if (ContextCompat.checkSelfPermission(EndlessService.this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
        {
            if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
            {
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 25000, 80, appLocationListener);

                Log.i(this.getClass().getSimpleName(), "GPS Tracking hat begonnen!");
            }
        }
    }
}

Unter Android 9 ging alles wunderbar!

Danke!

— geändert am 08.04.2020, 20:07:41

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 106

08.04.2020, 20:06:13 via Website

Ach so und das rufe ich aus dem BroadcastReceiver unter onReceive wie folgt auf nach dem Neustart:

Intent endlessServiceIntent = new Intent(contextForTimer, EndlessService.class);
endlessServiceIntent.setAction("START");
contextForTimer.startForegroundService(endlessServiceIntent);
Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 3.501

08.04.2020, 20:18:29 via Website

Hallo Paule,

ich habe Folgendes schon länger nicht mehr umgesetzt, da kein Bedarf war.
Ich vermute , es wird sich mit veränderten Restriktionen auch unter API 29 umsetzen lassen.

a) Starte deinen Service wie gewohnt als background
b) Beende ihn nach einer Zeit selbständig - z.b. 5Min
c) Mit dem Alarmmanager (oder was immer du jetzt bevorzugst) startest du den Service erneut (nach 6 Min)

Das Ganze nennt sich dann Heartbeat.

Damit hatte ich immer gute Ergebnisse , bis halt auf das zeitliche "Loch" in der Restart-Pause.

Hier mal auf die Schnelle etwas Ähnliches gefunden :
https://medium.com/@benexus/background-services-in-android-o-862121d96c95

— geändert am 08.04.2020, 20:30:10

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 1.217

08.04.2020, 21:13:54 via Website

Hallo danke für den Code. Der Service sollte laufen nicht vom System gekillt werden.

Aber ab api 29 sind einige Änderungen bei bei Diensten die Daten sammeln. Dazu zählt die camera, mikro, GPS....

GPS habe ich noch nicht getestet. Bei der Camera ist es so.
Da ist eine Abfrage der premissoin im Service notwendig. Damit auch im hindergrund Bilder gemacht werden.
Bilder werden gemacht aber die haben keinen Inhalt. Ohne die Abfrage. Ist die dazugehörigen activity gestartet geht es auch. Nach dem beenden nicht Mehr.

Denke bei GPS ist es ähnlich.

— geändert am 08.04.2020, 21:16:12

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 106

20.04.2020, 12:24:43 via Website

Hallo zusammen,

ich komme leider erst heute noch mal zu dem Thema.
Ich habe nun mal ein File-Logging gemacht und dabei ist mir aufgefallen, dass LocationListener die Methoden onProviderDisabled und onProviderEnabled selbständig aufgerufen werden ohne das ich aktiv das GPS über die Einstellungen ein- oder ausschalte. Wie kann das sein? Die Methoden werden doch eigentlich nur aufgerufen, wenn man aktiv das GPS in den Einstellungen aktiviert oder deaktiviert, oder?

Oder werden diese auch aufgerufen, wenn kein GPS oder schlechter GPS-Empfang vorhanden ist?

Manchmal liegen zwischen dem Aufruf von onProviderDisabled und onProviderEnabled meherre Minuten bis Stunden?

Grüße Paule

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 106

21.04.2020, 19:38:56 via Website

Hallo,

ich habe noch ein Problem.
ich wollte meine Methode zu tracken noch so aufbauen, dass ich auch über den Mobilfunk GPS Daten tracken kann. Zumindest verstehe ich den NETWORK_PROVIDER so. Ist das korrekt?
NETWORK_PROVIDER = Mobilfunk LTE, HSDP usw.
und
GPS_PROVIDER = GPS

Wenn dem so ist, dann verstehe ich erneut nicht warum folgendes nicht klappt:

Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);

if(locationManager != null && appLocationListener != null)
{
    Log.i(this.getClass().getSimpleName(), "TRACKING: Neustart LocationManager");

    locationManager.removeUpdates(appLocationListener);
}

locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

String provider = locationManager.getBestProvider(criteria, true);

if (provider != null)
{
    Log.i(this.getClass().getSimpleName(), "TRACKING: Provider " + provider + " gefunden!");

    appLocationListener = new APPLocationListener(getBaseContext(), provider);

    locationManager.requestLocationUpdates(provider, 1000, 10, appLocationListener, Looper.getMainLooper());
}
else
{
    Log.i(this.getClass().getSimpleName(), "TRACKING: Kein Provider (GPS oder NETWORK) gefunden!");
 }

Dies läuft in einer Methode in meinem Service. Die MEthode wird alle 5 Minuten aufgerufen um entweder über GWS oder das Netzwerk zu tracken.

Wenn ich GPS aktivere funktioniert es. WEnn ich GPS deaktiviere und nur Mobile Daten, also LTE, an habe dann läuft er in den Else Zweig "TRACKING: Kein Provider (GPS oder NETWORK) gefunden!".

Warum? getBestProvider gibt mir null zurück wenn ich nur Mobile Daten, also LTE, an habe.

Wäre super, wenn mich noch einmal jemand unterstützen könnte.

Grüße Paule

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 11.012

21.04.2020, 19:42:39 via Website

Bist du dir sicher dass du nur das GPS deaktiviert hast und nicht den "Standort".
Denn mit deaktiviertem Standort Dienst ist meiner Meinung nach auch keine NetworkLocation möglich

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 106

21.04.2020, 19:49:18 via Website

Was meinst du denn mit "Standort" deaktiviert? Die Berechtigung?

Hilfreich?
Diskutiere mit!
Empfohlene Artikel bei NextPit