No description
  • Java 94.8%
  • HTML 5.2%
Find a file
criehe d09ed4fb62 Add on-screen location info and JSON-driven install defaults
Two independent additions:

1. Optional on-screen location text in the camera preview (Foto-Einstellungen
   -> Standort -> 'Standort in Vorschau anzeigen'). Renders decimal lat/lng
   and, when enabled, the reverse-geocoded address (throttled to one
   Geocoder lookup per 30 s on a background thread). Gated on the existing
   'Standortdaten erfassen' preference so the GPS subscription is already
   active. New preference keys in PreferenceKeys, new entries in
   preferences_sub_location.xml + values/arrays.xml + strings.xml (en/de).

2. JSON-driven install defaults at app/src/main/assets/default_features.json,
   applied by the new DefaultFeaturesLoader from MainActivity.setDeviceDefaults().
   Each entry sets a SharedPreferences key (bool/int/long/float/string) to
   a fixed value. Re-applied on 'Reset settings'. Bumping the JSON's
   _version field forces re-application on next launch without losing
   unrelated user customizations on regular app updates.
2026-07-08 20:20:33 +02:00
.idea/inspectionProfiles Initial import of Open Camera 1.56.2 source with custom address-stamp patch 2026-07-07 21:12:36 +02:00
_docs Initial import of Open Camera 1.56.2 source with custom address-stamp patch 2026-07-07 21:12:36 +02:00
app Add on-screen location info and JSON-driven install defaults 2026-07-08 20:20:33 +02:00
fastlane/metadata/android/en-US/images Initial import of Open Camera 1.56.2 source with custom address-stamp patch 2026-07-07 21:12:36 +02:00
gradle/wrapper Initial import of Open Camera 1.56.2 source with custom address-stamp patch 2026-07-07 21:12:36 +02:00
.gitattributes Add .gitattributes to lock line-ending policy 2026-07-07 21:23:47 +02:00
.gitignore Add /dist/ to .gitignore so APK distribution copies stay out of VCS 2026-07-07 21:36:19 +02:00
AGENTS.md Add on-screen location info and JSON-driven install defaults 2026-07-08 20:20:33 +02:00
androidx_LICENSE-2.0.txt Initial import of Open Camera 1.56.2 source with custom address-stamp patch 2026-07-07 21:12:36 +02:00
build.gradle Initial import of Open Camera 1.56.2 source with custom address-stamp patch 2026-07-07 21:12:36 +02:00
google_material_design_icons_LICENSE-2.0.txt Initial import of Open Camera 1.56.2 source with custom address-stamp patch 2026-07-07 21:12:36 +02:00
gpl-3.0.txt Initial import of Open Camera 1.56.2 source with custom address-stamp patch 2026-07-07 21:12:36 +02:00
gradle.properties Initial import of Open Camera 1.56.2 source with custom address-stamp patch 2026-07-07 21:12:36 +02:00
gradlew Initial import of Open Camera 1.56.2 source with custom address-stamp patch 2026-07-07 21:12:36 +02:00
gradlew.bat Initial import of Open Camera 1.56.2 source with custom address-stamp patch 2026-07-07 21:12:36 +02:00
makesrcarchive.bat Initial import of Open Camera 1.56.2 source with custom address-stamp patch 2026-07-07 21:12:36 +02:00
opencamera_source.txt Initial import of Open Camera 1.56.2 source with custom address-stamp patch 2026-07-07 21:12:36 +02:00
README.md Add on-screen location info and JSON-driven install defaults 2026-07-08 20:20:33 +02:00
settings.gradle Initial import of Open Camera 1.56.2 source with custom address-stamp patch 2026-07-07 21:12:36 +02:00

Open Camera — erweiterte Variante mit Adressstempel

Dies ist der Source-Stand von Open Camera v1.56.2 (versionCode=96, versionName=1.56.2), verteilt vom Originalautor Mark Harman unter GPL v3+ (gpl-3.0.txt). Die Original-Quelle lag bis zu diesem Commit als Source-Archiv-Build vor (siehe makesrcarchive.bat), die kanonische SourceForge-Veröffentlichung ist net.sourceforge.opencamera.

Dieses Repository enthält ausschließlich Java-/XML-Sourcen und die Gradle-/Wrapper-Konfiguration. Es existieren zwei Begleitdokumente:

  • opencamera_source.txt — das mitgelieferte Original-Manual des Originalautors.
  • AGENTS.md — Hinweise für nachfolgende OpenCode-/Agent-Sessions (Build, Tests, Konventionen).

Was wurde gegenüber dem Original-Archiv geändert?

Bereich Änderung
Adressstempel (Hauptmerkmal) Neue, durch den Nutzer konfigurierbare Vorlage für den auf das Bild gestempelten Standort: Statt nur GPS-Koordinaten rendert die App einen über android.location.Geocoder nachgeschlagenen Straßennamen + Hausnummer + Postleitzahl + Stadt. 3-Wege-Schalter („nur Koordinaten" / „nur Adresse, mit Koordinaten-Fallback" / „Adresse + Koordinaten") und eine freie Textvorlage mit Tokens ({street}, {number}, {district}, {city}, {state}, {region}, {postcode}, {country}, {country_code}, {full}, {lat}, {lng}, \n). UI unter Foto-Einstellungen → Stempel → Verwende Adressen / Adressstempel-Format.
Standort in Vorschau Optionale Text-OSD-Anzeige der aktuellen GPS-Position in der Kameravorschau (Foto-Einstellungen → Standort → Standort in Vorschau anzeigen). Modi: „Nur GPS-Koordinaten" oder „GPS-Koordinaten und Adresse". Die Adresse wird per Geocoder nachgeschlagen und höchstens alle 30 s aktualisiert. Erfordert „Standortdaten erfassen".
Default-Funktionen via JSON Neue Datei app/src/main/assets/default_features.json listet für jede in PreferenceKeys.java definierte SharedPreferences-Option einen bool/int/long/float/string-Default. DefaultFeaturesLoader.java wendet sie beim ersten Start und auf Einstellungen zurücksetzen an. Das Feld _version in der JSON erzwingt eine Re-Anwendung nach einem App-Update.
Privacy Online-Datenschutzhinweis in _docs/privacy_oc.html und im App-internen preference_privacy_policy_text ergänzt: Bei aktivem Adressstempel werden GPS-Daten via System-Geocoder an einen Drittanbieter-Backend-Service übermittelt.
Gradle-Wrapper gradle/wrapper/gradle-wrapper.jar war im Archiv von 2015 und enthielt keine GradleWrapperMain-Klasse. Ersetzt durch das Wrapper-JAR aus der Gradle-8.13-Distribution, damit ./gradlew mit aktuellen AGP/Gradle-Versionen funktioniert. Originaldatei liegt als gradle-wrapper.jar.bak.2015 daneben (per .gitignore ausgeschlossen).
AGENTS.md Agenten-Notizen für künftige Sessions: Build-Pfad, Tests, Repo-Konventionen, AGENTS.md-/online-Privacy-Vertrag, Verzeichnislayout.
.gitignore Ergänzt um /gradlew_lf (Sandbox-Workaround zum CRLF-strippenden Ausführen von gradlew) und *.bak-Backup-Rotation.

Adressstempel-bezogene Commits/Diffs sind in PostProcessing.java, TextFormatter.java, MyApplicationInterface.java, ImageSaver.java, PreferenceKeys.java, preferences_sub_photo.xml, values/strings.xml, values-de/strings.xml, _docs/privacy_oc.html zu finden.

Kompilieren

Voraussetzungen

  • JDK 17 (Temurin/Adoptium oder das Arch-Paket jdk17-openjdk). app/build.gradle erzwingt die Toolchain via java { toolchain { languageVersion = JavaLanguageVersion.of(17) } }.
  • Android SDK mit:
    • platforms;android-36 (für compileSdk = 36, targetSdkVersion = 36)
    • build-tools;35.0.0 (transitiv von AGP 8.13 gefordert; zusätzlich zum hier mitgelieferten build-tools/36)
    • build-tools;36.0.0
    • platform-tools (für adb)
  • Lizenzen akzeptiert via sdkmanager --licenses (notwendig, bevor AGP Build-Tools automatisch nachlädt).
  • Linux-spezifisch: gradlew im Repo hat Windows-CRLF-Zeilenenden (per opencamera_source.txt und AGENTS.md so vorgesehen). Auf Linux stören die \r-Bytes. Der mitgelieferte Wrapper muss also zumindest beim Aufruf nach LF gefiltert werden — das Original-File wird nicht angefasst.

Build-Befehle

export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
export ANDROID_HOME=/<pfad-zum-SDK>
export ANDROID_SDK_ROOT="$ANDROID_HOME"
export PATH="$JAVA_HOME/bin:$ANDROID_HOME/platform-tools:$PATH"

# CRLF-Workaround: original gradlew nach LF filtern, dann ausführen
{ tr -d '\r' < gradlew; } > gradlew_lf
chmod +x gradlew_lf

./gradlew_lf :app:tasks                  # Übersicht aller Tasks
./gradlew_lf :app:assembleDebug          # debug-APK → app/build/outputs/apk/debug/
./gradlew_lf :app:assembleRelease        # release-APK (unsigniert) → app/build/outputs/apk/release/
./gradlew_lf :app:testDebugUnitTest      # JVM-Unit-Tests
./gradlew_lf :app:lint                   # Lint (nicht-blockierend, abortOnError=false)

Auf einer reinen Windows- oder macOS-Shell kann das Original ./gradlew … direkt verwendet werden — CRLF stört dort nicht.

APK-Signatur (Release)

Der Build produziert app-release-unsigned.apk. Zum Installieren oder Veröffentlichen muss er signiert werden. Empfohlener Ablauf für einen lokalen Test-Keystore:

keytool -genkey -v -keystore ~/.android/debug.keystore \
        -alias androiddebugkey -keyalg RSA -keysize 2048 -validity 10000 \
        -storepass android -keypass android

$ANDROID_HOME/build-tools/36.0.0/apksigner sign \
        --ks ~/.android/debug.keystore --ks-key-alias androiddebugkey \
        --ks-pass pass:android --key-pass pass:android \
        app/build/outputs/apk/release/app-release-unsigned.apk

Installation auf einem Gerät

Gerät via USB anschließen, USB-Debugging in den Entwickleroptionen aktivieren, RSA-Fingerprint-Dialog am Telefon bestätigen.

adb devices
./gradlew_lf :app:installDebug                 # baut + installiert in einem Schritt
# oder:
adb install -r app/build/outputs/apk/debug/app-debug.apk

Bereits beim Install werden die Runtime-Permissions ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION, RECORD_AUDIO, BLUETOOTH_CONNECT per pm grant erteilt. BLUETOOTH_SCAN wird typischerweise erst beim ersten Aktivieren des Bluetooth-Remote-Features abgefragt.

Bedienung des Adressstempels

  1. Einstellungen → Foto-Einstellungen → Stempel einschalten (Vorwahl „Datum und GPS", o. ä.).
  2. In derselben Stempel-Kategorie:
    • Verwende Adressen auf „Nur Adresse anzeigen" oder „Adresse und GPS-Koordinaten anzeigen" stellen.
    • Adressstempel-Format nach Wunsch anpassen, z. B. {street} {number}\n{postcode} {city} oder {street} {number} · {city} ({postcode}).
  3. Sicherstellen, dass Standortdaten erfassen (Foto-Einstellungen → Standort-Einstellungen → Location) aktiv ist.
  4. Foto schießen. Bei aktivem GPS-Fix wird die Vorlage mit den Geocoder-Daten gerendert. Wenn der Geocoder leer zurückgibt (kein Backend, kein Netz), fällt der Modus „Nur Adresse" auf GPS-Koordinaten zurück.

Tests

  • app/src/test/.../UnitTest.java — JVM-only, läuft via ./gradlew_lf :app:testDebugUnitTest. 26/27 grün; die eine Fehlstellung in testFormatLevelAngle ist eine locale-abhängige DecimalFormat-Assertion, nicht durch den Adressstempel verursacht.
  • app/src/androidTest/... — instrumentiert, benötigt echtes Gerät oder Emulator via ./gradlew_lf :app:connectedDebugAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=<Suite-Klassenname>.

Helper: TestUtils, CameraController2, die per-device Klassen (Nexus7InstrumentedTests, OldDeviceInstrumentedTests) usw. siehe AGENTS.md → Tests.

Verzeichnislayout (Auszug)

app/src/main/java/net/sourceforge/opencamera/
  MainActivity.java, OpenCameraApplication.java
  MyApplicationInterface.java, MyDebug.java          App-Glue
  DefaultFeaturesLoader.java                         JSON-Defaults aus assets/
  PreferenceSub*.java, MyPreferenceFragment.java    Settings-Tabs
  preview/Preview.java                               Capture-Pipeline
  cameracontroller/                                  API-Abstraktion (Camera1/Camera2)
  remotecontrol/                                      Bluetooth-Remote (BLE)
  HDRProcessor.java, PanoramaProcessor.java,
  ImageSaver.java, JavaImageProcessing*.java        Bildverarbeitung
  TextFormatter.java                                  Datum / GPS / Adressstempel
  PostProcessing.java                                 Stempel → Bitmap
  ui/                                                 MainUI, DrawPreview, …
app/src/main/assets/          Lizenztexte im APK + default_features.json
app/src/main/res/             Layouts, Strings, Drawables
_docs/                        HTML für In-App-Hilfe & Datenschutz
fastlane/metadata/            Play-Store-Listing-Assets
.gradle/, build/              Build-Artefakte (in .gitignore)

Lizenz

gpl-3.0.txt — GPL v3 oder höher. Siehe insbesondere die Anforderungen zur Bereitstellung des Quellcodes bei Forks. Beim Verteilen einer abgeleiteten App müssen drei Dinge rebranded werden — siehe opencamera_source.txt und AGENTS.md:

  1. Package-Name
  2. Online-Hilfe-URL (MainActivity.getOnlineHelpUrl())
  3. Lizenz- und Datenschutz-String-Ressourcen (preference_licence_open_camera_text, preference_privacy_policy_text)

Bekannte Eigenheiten dieser Variante

  • gradlew_lf ist eine Sandbox-/Linux-Workaround-Kopie; nicht zum Commit vorgesehen (per .gitignore ausgeschlossen).
  • gradle/wrapper/gradle-wrapper.jar.bak.2015 liegt als Wiederherstellungs-Backup neben dem modernen Wrapper-JAR.
  • app-debug.apk und app-release-unsigned.apk werden im Working-Tree erzeugt und sind durch *.apk in .gitignore vom Tracking ausgeschlossen.