GPS kontinuierlich empfangen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

Hi Leute
Ich beschäftige mich damit, GPS-Daten kontinuierlich auf meinem eigenen Handy (Galaxy XCover 4s) zu empfangen AUCH wenn die App beendet werden sollte.
Ich versuche damit privat z.B. meine Arbeitszeit zu registrieren.
Ich mache das in Python Kivy/KivyMD mit dem Modul plyer.
Das was funktioniert ist, dass ich solange die App geöffnet habe, d. h. solange das kleine Standortsymbol in der oberen Leiste im Handydisplay zu sehen ist, ich GPS-Daten empfange und
in einem Label auf dem Display angezeigt bekomme. Diese Daten schreibe ich immer wenn sie dann ankommen, direkt in eine Datenbank. Dann lese ich direkt nach dem Speichern den letzten
Datenbankeintrag aus (die ID des jeweilig letzten Datenbankeintrags).
In meiner App habe ich also ein Label mit den GPS-Daten

Code: Alles auswählen

        self.lb_gps_data = (
            f"{lat}\n{lon}\n{speed}\n{bearing}\n{altitude}\n{accuracy}")
und darunter den letzten Datenbankeintrag in einem zweiten Label:

Code: Alles auswählen

self.lb_table_id = db_last_value
Die GPS-Daten erhalte ich durch einen Thread, der im Hintergrund läuft, und der mit einem Dispatcher kommuniziert, um mir dann wieder zurückgeschickt werden zu können.
Hier ein Codeausschnitt (ohne Datenbank):

Code: Alles auswählen

class GPSBackgroundThread(Thread):
    def __init__(self, dispatcher):
        super(GPSBackgroundThread, self).__init__()
        self.gps_db_name = 'DB_Name'
        self.tbl_name = 'Tabellenname'
        self.db = Datenbank(self.gps_db_name)
        self.db.create(self.tbl_name)
        self.dispatcher = dispatcher

    def run(self):
        gps.configure(on_location=self.on_location)
        gps.start(minTime=1000, minDistance=1)

    def on_location(self, **kwargs):
        (lat, lon, speed, bearing, altitude, accuracy) = (
            kwargs["lat"], kwargs["lon"], kwargs["speed"], kwargs["bearing"], kwargs["altitude"], kwargs["accuracy"])
        data = [(lat, lon, speed, bearing, altitude, accuracy)]
        self.db.write(self.tbl_name, data)
        db_last_value = f"{self.db.fetchone_last(self.tbl_name)}"
        self.dispatcher.send_gps_data(lat, lon, speed, bearing, altitude, accuracy, db_last_value)


class GPSDataDispatcher(object):
    def __init__(self):
        self.handlers = []

    def bind(self, handler):
        self.handlers.append(handler)

    def send_gps_data(self, lat, lon, speed, bearing, altitude, accuracy, db_table_id):
        for handler in self.handlers:
            handler(lat, lon, speed, bearing, altitude, accuracy, db_table_id)


class GPS(Screen):
    lb_gps_data = StringProperty()
    lb_bd_value = StringProperty()

    def __init__(self, **kwargs):
        super(GPS, self).__init__(**kwargs)
        self.dispatcher = GPSDataDispatcher()
        self.dispatcher.bind(self.update_gps_data)

    @mainthread
    def update_gps_data(self, lat, lon, speed, bearing, altitude, accuracy, db_table_id):
        self.lb_gps_data = (
            f"{lat}\n{lon}\n{speed}\n{bearing}\n{altitude}\n{accuracy}")
        self.lb_bd_value = db_table_id
Solange ich also das Standortsymbol sehen kann, erhöht sich immer der Datenbankeintrag (also die ID).
Sobald ich aber die App wegwische oder in den Hintergrund setze, verschwindet das Standortsymbol und mein schöner Thread beendet seine Aufgabe.
Ich habe gehofft, das ein Thread vielleicht weiterläuft, auch ohne Standortsymbol :(
In den Einstellungen meines Handys bin ich schon auf Apps/MeineApp/Standort gegangen und habe gesehen, dass man max. nur "Zugriff nur während der Nutzung der App zulassen"
aktivieren kann. Das ist doof!
Gibt es da eine Möglichkeit, wie man auch mit ausgeschalteter App kontinuierlich GPS-Daten empfangen kann oder ist das als Schutzmaßnahme einfach komplett untersagt?
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Hatten wir das nicht schon mal hier?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es gibt ein freies Projekt, das behauptet das zu können. https://github.com/mendhak/gpslogger

Entweder benutzt du gleich das, oder du schaust, was die machen, damit das dauerhaft aufzeichnet. Wenn’s stimmt.
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

Das Beispiel ist in .java geschrieben :(
Das kenne ich nicht so wirklich. Mist
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

@sparrow: Das was wir schon mal hatten, bezog sich auf das reine Empfangen von GPS-Daten, womit ich Probleme hatte.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

DMD-OL hat geschrieben: Sonntag 3. März 2024, 14:27 Das Beispiel ist in .java geschrieben :(
Das kenne ich nicht so wirklich. Mist
Man kann das durchaus ausreichend verstehen, um daraus was abzuleiten. Vor allem aber ob es überhaupt möglich ist.
Antworten