- Java 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| android-app | ||
| gradle | ||
| .gitignore | ||
| build.gradle | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| README.md | ||
| settings.gradle | ||
Mängelmelder Erfurt Android
Native Android-App für den Mängelmelder der Landeshauptstadt Erfurt:
https://maengelmelder.erfurt.de/
Die App nutzt die vorhandenen FixMyStreet-Endpunkte der Website und sendet Meldungen als nicht eingeloggter Nutzer. Nach dem Absenden läuft der normale Bestätigungsprozess der Website per E-Mail.
Funktionen
- neue Mängelmeldung mit Titel, Beschreibung und Kategorie
- automatische Standortermittlung über Android
LocationManager - Kategorieabfrage passend zur aktuellen Position
- Fotoaufnahme mit EXIF-Ausrichtung einschließlich Spiegelungen; aufrechte Vorschau und JPEG-Upload
- OpenStreetMap-Karte mit Markierung des ermittelten Meldungsortes
- Abstände für Android-Statusbar, Navigationsleiste, Displayausschnitte und Tastatur
- optionaler IMAP-Abruf zur automatischen E-Mail-Bestätigung
- Einstellungen für dauerhaft hinterlegten Namen und E-Mailadresse
- Option, ob der Name öffentlich angezeigt werden darf
Projektstruktur
.
├── android-app/
│ ├── README.md
│ └── app/
│ ├── build.gradle
│ └── src/main/
├── build.gradle
├── gradle.properties
├── gradle/
├── gradlew
├── gradlew.bat
└── settings.gradle
Das Gradle-Modul heißt :app; sein Projektverzeichnis ist android-app/app.
Voraussetzungen
- JDK 17
- Android SDK mit Compile SDK 36
- Internetzugriff für Gradle-Abhängigkeiten, falls sie noch nicht lokal im Cache liegen
- Android-Gerät oder Emulator zum Installieren/Testen
Build
Debug-APK bauen:
./gradlew :app:assembleDebug
Das APK liegt danach unter:
android-app/app/build/outputs/apk/debug/app-debug.apk
Installation auf einem angeschlossenen Gerät:
adb install -r android-app/app/build/outputs/apk/debug/app-debug.apk
Tests und Checks
Kompilierung prüfen:
./gradlew :app:compileDebugJavaWithJavac
Unit-Tests für Absenderprüfung, MIME-Dekodierung und Linkbeschränkung ausführen:
./gradlew :app:testDebugUnitTest
Lint ausführen:
./gradlew :app:lintDebug
Endpunkte
Die App spricht aktuell direkt https://maengelmelder.erfurt.de an.
- Kategorien:
GET /report/new/ajax?latitude=...&longitude=... - Meldung senden:
POST /report/new/mobile
Die Basis-URL ist in MaengelmelderApi.java als Konstante hinterlegt.
Datenschutz und lokale Daten
Name und E-Mailadresse werden lokal in SharedPreferences gespeichert, damit sie nicht bei jeder Meldung neu eingegeben werden müssen. Diese Werte sind funktionale Nutzereinstellungen und keine im Repository enthaltenen Zugangsdaten.
Fotos werden vor dem Versand im privaten App-Dateibereich abgelegt. Für den Upload wird eine aufrecht ausgerichtete JPEG-Kopie ohne die ursprünglichen EXIF-Metadaten erzeugt (maximal 2400 Pixel längste Seite, JPEG-Qualität 90). Die Vorschau zeigt das vollständige Bild.
IMAP-Passwörter werden mit AES-GCM verschlüsselt; der Schlüssel liegt im Android Keystore. App-Backups sind deaktiviert. Im Repository sind keine Zugangsdaten enthalten. Die Kartenansicht lädt Daten von OpenStreetMap; dabei werden IP-Adresse und angezeigter Kartenausschnitt an den Kartendienst übertragen.
Karte
Nach der Standortermittlung erscheint eine zoombare und verschiebbare Karte mit Markierung. Sie dient der Positionskontrolle. Verschieben der Karte verändert die Koordinaten der Meldung nicht. Mit Standort aktualisieren wird die Position neu ermittelt. Zum Laden der Karte ist Internetzugriff erforderlich.
Optionale IMAP-Bestätigung
- In Einstellungen die automatische E-Mail-Bestätigung einschalten.
- IMAP-Server, Verbindungsart, Port, Benutzername und Passwort beziehungsweise App-Passwort hinterlegen. Standard ist direktes TLS auf Port 993. Für STARTTLS die Option STARTTLS verwenden aktivieren (normalerweise Port 143). Beim Wechsel wird ein Standardport automatisch angepasst; eigene Ports bleiben erhalten. Das Postfach muss die Bestätigungsmails für die gespeicherte Meldungs-E-Mailadresse empfangen.
- Eine Meldung senden. Solange der Hauptbildschirm geöffnet ist, prüft die App alle 30 Sekunden den Posteingang. Über Bestätigungsmails jetzt abrufen ist ein sofortiger Versuch möglich.
Der Abruf unterstützt direktes TLS und STARTTLS mit Zertifikats- und Hostnamenprüfung. Bei STARTTLS muss die TLS-Umstellung vor der Anmeldung erfolgreich sein; ohne STARTTLS-Unterstützung des Servers wird die Verbindung abgebrochen. Bestehende Einstellungen verwenden weiterhin direktes TLS. OAuth-Anmeldung und unverschlüsselte Anmeldung werden nicht unterstützt. Die Funktion ist standardmäßig ausgeschaltet.
Bei Fehlern zeigt die App Hinweise für fehlgeschlagene Anmeldung, nicht auflösbare Servernamen, nicht erreichbare Server, Zeitüberschreitungen, TLS-Probleme und nicht entschlüsselbare Zugangsdaten. Bei Anmeldefehlern IMAP beim Mailanbieter freigeben und gegebenenfalls ein App-Passwort verwenden. Verbindungsart und Port müssen zur Konfiguration des Anbieters passen. Unbekannte Fehler können auch beim Verarbeiten der Mail oder Öffnen des Bestätigungslinks entstehen. Serverantworten und Zugangsdaten werden nicht in Fehlermeldungen ausgegeben.
Verarbeitet werden nur nach dem Versand eingegangene E-Mails mit genau einem Absender maengelmelder@erfurt.de, passender Empfängeradresse und dem Meldungstitel im Text. HTML, Klartext und MIME-Multipart werden berücksichtigt; Anhänge werden ignoriert. Die Absenderprüfung prüft den From-Header und ersetzt keine Spam-/DKIM-Prüfung des Mailanbieters.
Automatisch geöffnet wird nur ein eindeutiger FixMyStreet-Bestätigungslink unter https://maengelmelder.erfurt.de/P/<token>. Auch jede Weiterleitung bleibt auf https://maengelmelder.erfurt.de/; fremde Hosts, HTTP, Benutzerinformationen und alternative Ports werden abgelehnt. Ein erfolgreicher HTTP-Aufruf wird als aufgerufener Bestätigungslink angezeigt, nicht als unabhängig verifizierter Meldungsstatus.
Der Posteingang wird nur lesend geöffnet; E-Mails werden weder gelöscht noch als gelesen markiert. Ausstehende Aufträge werden lokal gespeichert und beim nächsten Öffnen fortgesetzt. Nach 24 Stunden erfolgt keine automatische Bestätigung mehr. Bereits aufgerufene Links werden anhand eines lokalen Hashes erkannt. Bei fehlender oder nicht eindeutig zuordenbarer Mail kann die Bestätigung weiterhin manuell erfolgen.
Git-Hygiene
Die .gitignore schließt lokale und generierte Dateien aus, insbesondere:
.gradle/**/build/local.properties- Android-Studio-Dateien
- APK/AAB-Artefakte
- lokale Codex/Agent-Metadaten
Technische Referenzen
Manuelle Geräteprüfung
- Android 15/16 und ältere Version: Hauptbildschirm und Einstellungen dürfen sich mit Statusbar, Displayausschnitt und Navigation nicht überschneiden; auch bei geöffneter Tastatur und im Querformat prüfen.
- Hochkant-, Querformat- und gespiegelte Kamerafotos: vollständige, aufrechte Vorschau sowie identische Ausrichtung der Upload-Kopie prüfen.
- Karte: Marker mit den angezeigten Koordinaten vergleichen; Zoomen, Verschieben und erneute Standortermittlung prüfen.
- IMAP mit einem Testpostfach: direktes TLS und STARTTLS, verzögerte Zustellung, falscher Absender, fremde Links, ausgeschaltete Funktion, ungültige Zugangsdaten und Neustart mit ausstehender Bestätigung prüfen. Bei STARTTLS auch fehlende Serverunterstützung und ungültige Zertifikate prüfen; dabei darf keine Anmeldung erfolgen.