Mal wieder ein Location Problem

W

WuDiDong

Neues Mitglied
0
Hallo,
ich versuche schon seit einigen Wochen eine funktionierende Lösung für mein Problem zu finden, aber irgendwie funktioniert nichts.

Was ich erreichen möchte:
Ich habe eine Garage mit elektrischen Garagentor. Das Tor kann man per TCP/IP Kommandos aus der Ferne öffnen/schließen.

Ich habe mir eine App geschrieben, die mir das Garagentor auf Button-Klick öffnet und schließt. Das funktioniert.
Diese App möchte ich "aufbohren": Drückt man auf einen "Automatik"-Button, soll die aktuelle Position des Handys ermittelt werden.
In Abhängigkeit von der Entfernung von Zuhause sollen weitere Positionsabfragen gemacht werden.
Die Zeit zwischen zwei Location-Updates soll also erst groß sein, und dann immer schneller werden, je näher ich der Garage komme.
Habe ich mich auf wenige Meter genähert, soll sich das Garagetor automatisch öffnen.

Ich habe jetzt viele Vorschläge aus dem Internet ausprobiert, aber keine der genannten Lösungen funktioniert.
Zum Beispiel werden in den Beispielen immer die Methode requestLocationUpdates() verwendet.
Die zyklischen Positionsabfragen werden aber sofort eingestellt, wenn das Handy in den Doze Modus geht.
Das Ganze soll aber unabhängig weiter funktionieren, auch wenn man die App beendet.

Bisher habe ich das nur mit einem AlarmManager hinbekommen.
Ich bekomme zyklische Alarme, auch wenn die App beendet wird, oder das Handy "abdunkelt".
Dann habe ich aber das nächste Problem: Das zyklische Triggern per requestLocationUpdates() macht keinen Sinn, weil die zyklischen Events vom Alarm-Manager erzeugt werden. Ausserdem soll ja auch die Updatefrequenz variiert werden.
Ich brauche also eine Methode, um einzelne Positionsabfragen zu triggern, immer dann, wenn der Alarm ausgelöst wird.
Eine Methode um eine einzelne Positionsabfrage zu triggern scheint es aber nicht zu geben.

Hat Irgendjemand eine Idee, wie man das am besten hinbekommt?

Oder anders gefragt: Weiß jemand (am besten mit einem Beispielcode) wie man einzelne LocationRequests mit einem AlarmManager hinbekommt?
Und das das auch noch funktioniert, wenn das Handy in den Doze Mode geht oder die App beendet wird?
 
Zuletzt bearbeitet:
@WuDiDong

herzlichst willkommen in unserem Forum

a)
Hat Irgendjemand eine Idee, wie man das am besten hinbekommt?
Die API Documentation gibt dazu Aufschluss, denn das, was du Umsetzen möchtest, ist NICHT mehr Möglich.
Dies sei dem AkkuWahnsinn der Hersteller geschuldet (größer , breiter, länger)

b)
Der AlarmManager u.Ä. sind dafür lange schon deprecated - und sind eh "Eieruhren" mit Eigenleben und eignen sich für eine
stündlich/täglich undefinierte Routine - mehr aber auch nicht .
Note: Beginning with API 19 (Build.VERSION_CODES.KITKAT) alarm delivery is inexact: the OS will shift alarms in order to minimize wakeups and battery use.
Quelle : https://developer.android.com/reference/android/app/AlarmManager

c)
Services ( START_NOT_STICKY ) werden auch von System ins Nirvana geschickt
Jojo Techniken (SelfRestart of Services) sind nun ebenfalls im DOZE blockiert worden.

d)
Verbleibende einzige DOZE/IDLE Möglichkeit :

Du musst das Smartphone mittels High Priority-Push temporär aufwecken .
Quelle : Optimize for Doze and App Standby | Android Developers
(Nur zur Info : Das funktioniert nicht mit allen Herstellern)

Ergo : Server aufsetzen, App in die Console laden und veröffentlichen. Firebase-FCM oder HMS einbinden.
Wichtig : Dabei bitte die Kosten im Auge behalten .

e)
Drückt man auf einen "Automatik"-Button, soll die aktuelle Position des Handys ermittelt werden.
Kleine Anmerkung : "Requesten" kannst Du die Location ebenfalls nicht mehr auf Knopfdruck.
Das ist ein Callback nach der erfolgreichen Triangulären Ortung. (Das System entscheidet die Response-Zeit)

Ich habe jetzt viele Vorschläge aus dem Internet ausprobiert, aber keine der genannten Lösungen funktioniert.
Wie oben bereits "leise" angedeutet, würde ich empfehlen, von Beispielen aus dem Netz abzusehen und sich eher an die API Documentation zu halten. Dann bastelt man nicht sinnlos tagelang herum und probiert veralteten Code aus.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: jogimuc
Danke für die "direkte" Antwort.
Ich hab's schon befürchtet.....
In den Beispielen/Foren heißt es immer : "Warum nimmste nicht Dies statt Das, das ist doch viel besser."
Dann probiert man es, und es geht auch nicht.
Mit den ungenauen Zeiten des Alarm Managers könnte ich leben.

Aber eins verstehe ich immer noch nicht:
Ich teste das gerade mit zykischen 1-Minute Alarmen:
Ich starte in der MainActivity per Button-Klick den ersten Alarm (1-Minute).
Der Alarm wird dann tatsächlich nach 1 Minute ausgelöst (BroadcastReceiver).
Im BroadcastReceiver (wenn der Timer auslöst) starte ich einen neuen Alarm (1 Minute).
u.s.w.
Diese zyklischen 1-Minute Alarme lösen tatsächlich aus.
UND ZWAR unabhängig davon, ob die App , die die Kette gestartet hat aktiv läuft, das Handy schlafen geht, oder ob ich die App manuell beende. Grundsätzlich scheint es also zu gehen.
Ich bekomme es nur nicht hin, im Brodcast Receiver beim Auslösen des Alarm EINMAL die Location abzufragen, die Entfernung zu berechnen, und das TCP Kommando zu senden, wenn ich zuhause bin
 
Du hast einen Alarm mit einer min ok . Am Anfang nach dem Start wird das gehen aber nach einiger Zeit werden die Abstände länger als eine min. Das macht das System selbständig es merkt wie oft was im Hindernd gemacht wird und drosselt es.

Teste es doch einfach in dem du immer etwas in eine Datei schreibst mit Uhrzeit. Schaue nach paar Tagen nach wie die Abstände sind.
 

Ähnliche Themen

wernho
Antworten
11
Aufrufe
693
wernho
wernho
J
Antworten
5
Aufrufe
930
swa00
swa00
D
  • Data2006
Antworten
14
Aufrufe
487
jogimuc
J
Zurück
Oben Unten