77 lines
3.7 KiB
Markdown
77 lines
3.7 KiB
Markdown
# AlbumViewModel
|
|
|
|
## Ü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. |