- Dokumentation
- Bereinigung von Code
This commit is contained in:
@@ -1,40 +1,77 @@
|
||||
# Album/Kamera-System Dokumentation
|
||||
# AlbumViewModel
|
||||
|
||||
## AlbumViewModel
|
||||
|
||||
```kotlin
|
||||
class AlbumViewModel(private val coroutineContext: CoroutineContext) : ViewModel()
|
||||
```
|
||||
|
||||
**Zweck:** Verwaltung von Bildauswahl und Kamera-Aufnahmen für Schadensmeldungen.
|
||||
|
||||
### Properties
|
||||
|
||||
| Name | Typ | Beschreibung |
|
||||
|------|-----|--------------|
|
||||
| `viewStateFlow` | `StateFlow<AlbumViewState>` | Read-only State für UI-Komponenten |
|
||||
|
||||
### Methoden
|
||||
|
||||
#### `onReceive(intent: Intent)`
|
||||
Verarbeitet Benutzeraktionen für Bild-Verwaltung.
|
||||
|
||||
**Parameter:**
|
||||
- `intent: Intent` - Benutzeraktion (siehe Intent-Klasse)
|
||||
|
||||
**Verwendete Intents:**
|
||||
- `OnPermissionGrantedWith(Context)` - Erstellt temp. Datei für Kamera
|
||||
- `OnFinishPickingImagesWith(Context, List<Uri>)` - Lädt Bilder aus Galerie
|
||||
- `OnImageSavedWith(Context)` - Speichert Kamera-Aufnahme
|
||||
- `OnImageSavingCanceled` - Verwirft temp. Datei
|
||||
- `OnPermissionDenied` - Loggt Permission-Verweigerung
|
||||
|
||||
**Deprecated Intents:** `OnPermissionGranted`, `OnFinishPickingImages`, `OnImageSaved` (ohne Context)
|
||||
|
||||
#### `clearSelection()`
|
||||
Löscht alle ausgewählten Bilder aus dem State.
|
||||
## Übersicht
|
||||
Die Klasse `AlbumViewModel` ist für die zentrale Verwaltung von Bilddaten innerhalb der App zuständig. Sie fungiert als Schnittstelle zwischen der Kamera-Hardware, der System-Galerie und der Benutzeroberfläche. Das ViewModel verarbeitet asynchrone Bildoperationen und stellt den aktuellen Status über einen reaktiven StateFlow bereit.
|
||||
|
||||
---
|
||||
|
||||
## 1. Klasse: AlbumViewModel
|
||||
`class AlbumViewModel(private val coroutineContext: CoroutineContext) : ViewModel()`
|
||||
|
||||
|
||||
|
||||
### Konstruktor-Parameter
|
||||
| Parameter | Typ | Beschreibung |
|
||||
| :--- | :--- | :--- |
|
||||
| `coroutineContext` | `CoroutineContext` | Der Kontext, in dem die Coroutines für Bildoperationen ausgeführt werden. |
|
||||
|
||||
---
|
||||
|
||||
## 2. Status-Management (State)
|
||||
|
||||
### `viewStateFlow: StateFlow<AlbumViewState>`
|
||||
Ein observierbarer Datenstrom, der den aktuellen Zustand der Bildverwaltung liefert. Er basiert auf der Datenklasse `AlbumViewState`.
|
||||
|
||||
**Wichtige Felder im State:**
|
||||
* **`tempFileUrl`**: Enthält die URL der temporären Datei, in der das mit der Kamera aufgenommene Bild zwischengespeichert wird.
|
||||
* **`selectedPictures`**: Enthält die Liste der mit der Kamera aufgenommenen oder aus der Galerie ausgewählten Bilder (als `ImageBitmap`).
|
||||
|
||||
---
|
||||
|
||||
## 3. Zentrale Methoden
|
||||
|
||||
### `onReceive(intent: Intent)`
|
||||
Diese Methode ist der zentrale Einstiegspunkt für alle Aktionen. Sie verarbeitet verschiedene `Intent`-Typen:
|
||||
|
||||
| Intent | Beschreibung |
|
||||
| :--- | :--- |
|
||||
| `OnPermissionGrantedWith` | Wird aufgerufen, wenn die Kamera-Berechtigung erteilt wurde. Erstellt eine temporäre Datei (`.jpg`) im Cache-Verzeichnis und generiert eine Inhalts-URI via `FileProvider`. |
|
||||
| `OnPermissionDenied` | Loggt die Verweigerung der Kamera-Berechtigung durch den Nutzer. |
|
||||
| `OnFinishPickingImagesWith` | Verarbeitet Bilder, die aus der Galerie ausgewählt wurden. Die URIs werden in `ImageBitmap` konvertiert und der Liste hinzugefügt. |
|
||||
| `OnImageSavedWith` | Wird nach einer erfolgreichen Kameraaufnahme aufgerufen. Dekodiert das Bild aus der `tempFileUrl` und fügt es der Auswahl hinzu. |
|
||||
| `OnImageSavingCanceled` | Setzt die `tempFileUrl` zurück, falls der Aufnahmevorgang abgebrochen wurde. |
|
||||
|
||||
### `clearSelection()`
|
||||
Setzt die Liste der ausgewählten Bilder (`selectedPictures`) auf eine leere Liste zurück.
|
||||
|
||||
---
|
||||
|
||||
## 4. Funktionsweise & Datenfluss
|
||||
|
||||
|
||||
|
||||
### Bildverarbeitung (Galerie)
|
||||
Beim Auswählen von Bildern aus der Galerie werden die `InputStreams` der bereitgestellten URIs ausgelesen. Um Speicher effizient zu nutzen, werden die Byte-Arrays mithilfe von `BitmapFactory` dekodiert und anschließend als Compose-kompatible `ImageBitmap` gespeichert.
|
||||
|
||||
### Bildverarbeitung (Kamera)
|
||||
1. **Vorbereitung**: Ein `File.createTempFile` erstellt einen Platzhalter im Cache.
|
||||
2. **Sicherheit**: Der `FileProvider` wandelt den Dateipfad in eine sichere URI um, damit die Kamera-App darauf zugreifen kann.
|
||||
3. **Abschluss**: Nach der Aufnahme wird `ImageDecoder` genutzt, um die Datei in eine Bitmap umzuwandeln.
|
||||
|
||||
---
|
||||
|
||||
## 5. Technische Voraussetzungen
|
||||
|
||||
### FileProvider-Konfiguration
|
||||
Damit die Kamera-App Bilder speichern kann, muss in der `AndroidManifest.xml` ein Provider definiert sein, der auf `${BuildConfig.APPLICATION_ID}.provider` hört.
|
||||
|
||||
### Abhängigkeiten
|
||||
* **androidx.lifecycle:lifecycle-viewmodel-ktx**: Für den `viewModelScope`.
|
||||
* **kotlinx-coroutines**: Für die asynchrone Verarbeitung der Bilddaten.
|
||||
* **androidx.compose.ui:ui-graphics**: Für die Konvertierung in `ImageBitmap`.
|
||||
|
||||
---
|
||||
|
||||
## Fehlerbehandlung
|
||||
* **NULL-Werte**: Falls ein InputStream nicht gelesen werden kann, wird eine Fehlermeldung geloggt, ohne die App zum Absturz zu bringen.
|
||||
* **Speichermanagement**: Bilder werden als Bitmaps im Speicher gehalten. Bei sehr großen Mengen sollte eine Skalierung (Sampling) in der `BitmapFactory` implementiert werden.
|
||||
Reference in New Issue
Block a user