3.7 KiB
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 (alsImageBitmap).
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)
- Vorbereitung: Ein
File.createTempFileerstellt einen Platzhalter im Cache. - Sicherheit: Der
FileProviderwandelt den Dateipfad in eine sichere URI um, damit die Kamera-App darauf zugreifen kann. - Abschluss: Nach der Aufnahme wird
ImageDecodergenutzt, 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
BitmapFactoryimplementiert werden.