3.8 KiB
ProximityNotificationService
Übersicht
Der ProximityNotificationService im Paket com.example.snapandsolve.service ist ein Android Foreground Service. Er ermöglicht die Hintergrund-Überwachung des Nutzerstandorts, um proaktiv Benachrichtigungen auszulösen, wenn sich der Nutzer in der Nähe (Standard: 100m) eines in ArcGIS registrierten Straßenschadens befindet.
1. Architektur & Lebenszyklus
Der Dienst ist darauf ausgelegt, unabhängig von der Sichtbarkeit der App zu laufen. Als Foreground Service ist er mit einer permanenten System-Benachrichtigung verknüpft, um eine vorzeitige Beendigung durch das Android-Betriebssystem zu verhindern.
Steuerung über das Companion Object
start(context, featureTable): Initialisiert den Dienst mit der notwendigen Datenquelle und startet ihn.stop(context): Beendet das Tracking und den Dienst.
2. Funktionsweise des Standorts-Trackings
Initialisierung
Nach dem Start (onCreate) wird die SystemLocationDataSource von ArcGIS initialisiert. Diese liefert kontinuierlich Standort-Updates innerhalb eines dedizierten serviceScope (CoroutineScope).
Geofencing-Logik (checkProximityToDamages)
Bei jedem Standort-Update führt der Dienst eine räumliche Analyse durch:
- Abfrage: Alle verfügbaren Features werden aus der
ServiceFeatureTableabgerufen. - Projektion: Da GPS-Koordinaten (
SpatialReference.wgs84()) oft nicht mit dem Koordinatensystem der Karte übereinstimmen, wird der Standort des Nutzers mittelsGeometryEngine.projectOrNulltransformiert. - Distanzberechnung: Die exakte Entfernung wird über
GeometryEngine.distanceGeodeticOrNullberechnet. Hierbei wird der KurventypGeodesicverwendet, um die Erdkrümmung korrekt zu berücksichtigen.
3. Benachrichtigungs-Management
Spam-Prävention
Um mehrfache Warnungen für denselben Schaden zu vermeiden, nutzt der Dienst ein internes Cache-System:
notifiedFeatures: Ein Set vonOBJECTIDs, für die bereits eine Benachrichtigung gesendet wurde.- Hysterese-Bereinigung: Eine ID wird erst dann aus dem Cache entfernt, wenn sich der Nutzer mehr als 150 Meter vom entsprechenden Schaden entfernt hat (
cleanupNotifiedFeatures). Dies verhindert "flackernde" Benachrichtigungen an der Radiengrenze.
Benachrichtigungs-Inhalt
Der Dienst sucht dynamisch nach verfügbaren Attributen im ArcGIS-Feature, um den Text zu generieren:
- Kategorie: Prüft Felder wie
Kategorie,kategorie,Categoryodercategory. - Beschreibung: Sucht nach zusätzlichen Details in
BeschreibungoderDescription.
4. Konfiguration & Konstanten
| Konstante | Wert | Beschreibung |
|---|---|---|
PROXIMITY_RADIUS_METERS |
100.0 | Radius, ab dem eine Warnung ausgelöst wird. |
CHANNEL_ID |
proximity_notifications |
ID des Android-Benachrichtigungskanals. |
START_STICKY |
Konstante | Sorgt für einen automatischen Neustart des Dienstes nach einem System-Kill. |
5. Voraussetzungen & Sicherheit
Erforderliche Berechtigungen
In der AndroidManifest.xml müssen folgende Berechtigungen konfiguriert sein:
ACCESS_FINE_LOCATION(Präziser Standort)ACCESS_BACKGROUND_LOCATION(Standort im Hintergrund)FOREGROUND_SERVICE(Erlaubnis für Hintergrunddienste)
Datenintegrität
Der Dienst setzt voraus, dass die ServiceFeatureTable beim Start übergeben wird. Ist die Tabelle null, stellt der Dienst die Überprüfung ein und loggt einen Fehler, bleibt aber als Foreground Service aktiv, um Systeminstabilitäten zu vermeiden.
Fehlerbehandlung
- Projektionsfehler: Falls die Koordinatentransformation fehlschlägt, wird das betroffene Feature übersprungen.
- Geometrie-Validierung: Nur Features mit gültigen Punkt-Geometrien werden verarbeitet.