Native Android-App zur Verwaltung von Wachteln und Eierproduktion, entwickelt mit Dioxus 0.7 und Rust.
- Profilverwaltung: Wachtel-Profile mit Name, Geschlecht, Geburtsdatum, Ringfarbe, Status und Fotos
- Ereignis-Tracking: Lebensereignisse pro Wachtel (Geboren, Krank, Gesund, Geschlachtet, etc.)
- Foto-Verwaltung: Mehrere Fotos pro Wachtel und Ereignis mit Galerie und Kamera-Integration
- Eier-Tracking: Tägliche Erfassung der Eierproduktion mit Historie
- Statistiken: Dashboard mit Durchschnittswerten und Zeitraum-Filtern
- SQLite-Datenbank: Vollständige lokale Datenpersistenz
- Native Android: JNI-Integration für Kamera, Galerie und FileProvider
stalltagebuch/
├── src/
│ ├── main.rs # Dioxus App Entry, Screen Routing
│ ├── error.rs # Zentrales Error-Handling
│ ├── camera.rs # JNI-Bridge für Camera & Gallery Intents
│ ├── filesystem.rs # JNI-basierter Dateizugriff
│ ├── image_processing.rs # Bild-Resize & Thumbnails (Placeholder)
│ ├── models/ # Domain-Modelle (Wachtel, EggRecord)
│ ├── services/ # Business Logic (Profile, Egg, Analytics)
│ ├── database/ # SQLite-Schema & Migrations
│ └── components/ # UI-Komponenten (Home, Profile, Tracking, Stats)
├── android/
│ ├── MainActivity.kt # Custom Activity mit Camera/Gallery Intents
│ ├── AndroidManifest.xml # Permissions & FileProvider Config
│ └── res/xml/file_paths.xml # FileProvider Paths
├── assets/
│ ├── main.css # Mobile-optimiertes Design
│ └── favicon.ico
├── build_android.sh # Wrapper Build-Script (siehe unten)
├── Cargo.toml # Rust Dependencies
└── Dioxus.toml # Dioxus CLI Config
- Rust (stable):
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh - Dioxus CLI:
curl -sSL http://dioxus.dev/install.sh | sh - Android NDK & SDK (API 28+, target 34)
- Gradle (automatisch via Android SDK)
- adb (Android Debug Bridge)
rustup target add x86_64-linux-android # Emulator
rustup target add aarch64-linux-android # Physisches GerätWichtig: Nutze das build_android.sh Wrapper-Script statt direktem dx build:
./build_android.shWas das Script macht:
- Bereinigt alte Android-Build-Artefakte
- Führt
dx build --platform androidaus - Kopiert custom
MainActivity.kt,AndroidManifest.xml,file_paths.xml - Erstellt
BuildConfig.ktTypealias (bridgeddev.dioxus.main→de.teilgedanken.stalltagebuch) - Patched
build.gradle.kts(Package-Name, SDK-Versionen) - Führt
gradlew assembleDebugaus - Prüft ob MainActivity im APK enthalten ist
APK-Pfad:
target/dx/stalltagebuch/debug/android/app/app/build/outputs/apk/debug/app-debug.apk
Installation:
adb install -r target/dx/stalltagebuch/debug/android/app/app/build/outputs/apk/debug/app-debug.apkLogcat (Debugging):
adb logcat | grep -iE "stalltagebuch|MainActivity|Permission"dx serve --platform desktopHinweis: Camera/Gallery funktioniert nur auf Android (JNI-basiert).
Manifest (android/AndroidManifest.xml):
CAMERA(runtime)READ_MEDIA_IMAGES(Android 13+, runtime)READ_EXTERNAL_STORAGE(maxSdkVersion 32, legacy)WRITE_EXTERNAL_STORAGE(maxSdkVersion 28, legacy)INTERNET(für zukünftige Features)
Runtime Permission Flow:
- Rust ruft
camera::capture_photo()odercamera::pick_image() - JNI-Bridge checkt Permission via
MainActivity.hasCameraPermission()/hasStoragePermission() - Falls fehlend:
requestCameraPermission()/requestStoragePermission()→ Android-Dialog - Nach Grant: Intent startet (
ACTION_IMAGE_CAPTUREoderACTION_GET_CONTENT) - Ergebnis via
ActivityResultLauncher→lastPhotoPath→ Rust polling
Warum notwendig?
- Standard Dioxus
WryActivityunterstützt keineActivityResultLauncherfür Camera/Gallery - Custom Activity erweitert
WryActivityund fügt Intent-Handling hinzu
Key Components:
class MainActivity : WryActivity() {
private lateinit var cameraLauncher: ActivityResultLauncher<Uri>
private lateinit var galleryLauncher: ActivityResultLauncher<String>
companion object {
@JvmStatic var instance: MainActivity? = null
@JvmStatic var lastPhotoPath: String? = null
@JvmStatic var lastError: String? = null
}
}JNI-Zugriff (Rust → Kotlin):
// camera.rs
let cls = load_class(&mut env, "dev/dioxus/main/MainActivity")?;
let (activity, _) = get_activity_instance(&mut env)?;
env.call_method(activity, "launchCamera", "()V", &[])?;Config (android/res/xml/file_paths.xml):
<external-cache-path name="my_images" path="/" />Authority: de.teilgedanken.stalltagebuch.fileprovider
Temporary Kamera-Fotos werden in getExternalCacheDir() gespeichert.
cargo testCoverage:
profile_service: CRUD Operationsegg_service: CRUD + Date Handlinganalytics_service: Statistik-Berechnungen
- Build & Install (siehe oben)
- App öffnen
- Profile erstellen: Navigation → "Profile" → "+" Button
- Kamera testen: Profil → Kamera-Icon → Permission-Dialog → Foto aufnehmen
- Galerie testen: Profil → Galerie-Icon → Permission-Dialog → Bild auswählen
- Eier erfassen: Navigation → "Eier Tracking" → Datum & Anzahl eingeben
- Statistik prüfen: Navigation → "Statistik" → Zeitraum-Filter (Alle/Woche/Monat/Jahr)
- Java source/target 8 deprecated: Legacy-Einstellung von Dioxus-generiertem Gradle-File
- extractNativeLibs in Manifest: AGP-Warnung (funktional korrekt)
- BuildConfig feature deprecated: Harmlos, wird durch Typealias umgangen
ClassNotFoundException: dev.dioxus.main.MainActivity
→ Lösung: Nutze build_android.sh statt dx build allein (Script copied MainActivity korrekt)
Camera/Gallery-Crash bei Permission-Denial
→ Lösung: Implementiert in MainActivity Permission-Checks vor Intent-Launch
JNI FindClass fails on native thread
→ Lösung: Nutze Application ClassLoader (siehe camera::get_app_class_loader())
- DEVELOPMENT.md: Build-Anleitung und Testing
- AGENTS.md: Dioxus 0.7 API-Referenz für AI-Assistenten
- PROPOSALS.md: Geplante Features
MIT or Apache2
Version: 0.1.0
Letzte Aktualisierung: 2025-11-09
Rust: 1.83+ | Dioxus: 0.7.1 | Min Android: API 28 (Android 9) | Target: API 34 (Android 14)