- Java 94.8%
- HTML 5.2%
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. |
||
|---|---|---|
| .idea/inspectionProfiles | ||
| _docs | ||
| app | ||
| fastlane/metadata/android/en-US/images | ||
| gradle/wrapper | ||
| .gitattributes | ||
| .gitignore | ||
| AGENTS.md | ||
| androidx_LICENSE-2.0.txt | ||
| build.gradle | ||
| google_material_design_icons_LICENSE-2.0.txt | ||
| gpl-3.0.txt | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| makesrcarchive.bat | ||
| opencamera_source.txt | ||
| README.md | ||
| settings.gradle | ||
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.gradleerzwingt die Toolchain viajava { toolchain { languageVersion = JavaLanguageVersion.of(17) } }. - Android SDK mit:
platforms;android-36(fürcompileSdk = 36,targetSdkVersion = 36)build-tools;35.0.0(transitiv von AGP 8.13 gefordert; zusätzlich zum hier mitgeliefertenbuild-tools/36)build-tools;36.0.0platform-tools(füradb)
- Lizenzen akzeptiert via
sdkmanager --licenses(notwendig, bevor AGP Build-Tools automatisch nachlädt). - Linux-spezifisch:
gradlewim Repo hat Windows-CRLF-Zeilenenden (peropencamera_source.txtundAGENTS.mdso 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
- Einstellungen → Foto-Einstellungen → Stempel einschalten (Vorwahl „Datum und GPS", o. ä.).
- 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}).
- Sicherstellen, dass Standortdaten erfassen (Foto-Einstellungen → Standort-Einstellungen → Location) aktiv ist.
- 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 intestFormatLevelAngleist eine locale-abhängigeDecimalFormat-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:
- Package-Name
- Online-Hilfe-URL (
MainActivity.getOnlineHelpUrl()) - Lizenz- und Datenschutz-String-Ressourcen
(
preference_licence_open_camera_text,preference_privacy_policy_text)
Bekannte Eigenheiten dieser Variante
gradlew_lfist eine Sandbox-/Linux-Workaround-Kopie; nicht zum Commit vorgesehen (per.gitignoreausgeschlossen).gradle/wrapper/gradle-wrapper.jar.bak.2015liegt als Wiederherstellungs-Backup neben dem modernen Wrapper-JAR.app-debug.apkundapp-release-unsigned.apkwerden im Working-Tree erzeugt und sind durch*.apkin.gitignorevom Tracking ausgeschlossen.