0Pricing
Android Academy · Lektion

Fotos aufnehmen

Ein Bild aufnehmen und speichern

Fotos aufnehmen ist eine kostenlose Android Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Android Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Android Academy-Kurs umfasst insgesamt 4 Lektionen.

Ein Foto aufnehmen

Nachdem die Vorschau auf dem Bildschirm angezeigt wird, besteht der nächste Schritt darin, ein Foto aufzunehmen. CameRX erledigt dies mit dem Anwendungsfall ImageCapture.

Sie binden ImageCapture zusätzlich zur Vorschau und rufen takePicture() auf, wenn die Person auf den Auslöser tippt. Anschließend speichern Sie das Ergebnis in der Galerie des Geräts.

Den ImageCapture-Anwendungsfall erstellen

ImageCapture wird mit einem Builder konfiguriert. Eine nützliche Option ist der Aufnahmemodus, der die Latenz gegen die Qualität abwägt:

  • CAPTURE_MODE_MINIMIZE_LATENCY – schneller Auslöser.
  • CAPTURE_MODE_MAXIMIZE_QUALITY – bestmögliche Bildqualität, etwas langsamer.
val imageCapture = ImageCapture.Builder()
    .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
    .build()

Preview und ImageCapture binden

Sie können mehrere Anwendungsfälle gleichzeitig binden. Übergeben Sie sowohl preview als auch imageCapture an bindToLifecycle, damit die Kamera das Livebild liefert und für die Aufnahme eines Fotos bereit ist.

cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
    lifecycleOwner,
    CameraSelector.DEFAULT_BACK_CAMERA,
    preview,
    imageCapture
)

Speicherort: MediaStore

Die moderne und mit Scoped Storage kompatible Methode zum Speichern eines Fotos führt über MediaStore. Sie beschreiben die Datei (Name, MIME-Typ und Ordner) mit ContentValues und überlassen es dem System, sie in der freigegebenen Sammlung Pictures abzulegen.

Unter Android 10 und höher funktioniert dies ohne die veraltete Berechtigung WRITE_EXTERNAL_STORAGE.

val name = "photo_${System.currentTimeMillis()}"
val contentValues = ContentValues().apply {
    put(MediaStore.MediaColumns.DISPLAY_NAME, name)
    put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg")
    put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/MyApp")
}

Ausgabeoptionen

Um CameraX mitzuteilen, wohin die JPEG-Datei geschrieben werden soll, erstellen Sie OutputFileOptions aus dem Content Resolver, der URI der Zielsammlung und Ihren ContentValues.

val outputOptions = ImageCapture.OutputFileOptions
    .Builder(
        context.contentResolver,
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
        contentValues
    )
    .build()

takePicture() aufrufen

Lösen Sie nun die Aufnahme aus. takePicture() übernimmt die Ausgabeoptionen, einen Executor und einen Callback. CameRX meldet Erfolg oder Fehler asynchron.

Verwenden Sie ContextCompat.getMainExecutor(context), damit der Callback im Hauptthread ausgeführt wird.

imageCapture.takePicture(
    outputOptions,
    ContextCompat.getMainExecutor(context),
    object : ImageCapture.OnImageSavedCallback {
        override fun onImageSaved(output: ImageCapture.OutputFileResults) {
            val savedUri = output.savedUri
            // Photo saved! Show a confirmation.
        }
        override fun onError(exc: ImageCaptureException) {
            // Handle the failure.
        }
    }
)

Das Ergebnis verarbeiten

Bei Erfolg enthält OutputFileResults.savedUri die URI des gespeicherten Bildes. Sie können es anzeigen (mit Coil), teilen oder eine Snackbar anzeigen, die das Speichern bestätigt.

Bei einem Fehler gibt ImageCaptureException an, was schiefgelaufen ist – protokollieren Sie den Fehler und informieren Sie die Nutzerin bzw. den Nutzer.

override fun onImageSaved(output: ImageCapture.OutputFileResults) {
    val uri = output.savedUri ?: return
    Toast.makeText(context, "Saved: $uri", Toast.LENGTH_SHORT).show()
}

Einen Auslöser-Button verdrahten

Überlagern Sie in Compose Ihre Vorschau mithilfe einer Box mit einem Auslöser-Button. Heben Sie die Referenz auf ImageCapture nach oben, damit onClick des Buttons takePhoto aufrufen kann.

Box(modifier = Modifier.fillMaxSize()) {
    CameraPreview(imageCapture = imageCapture)
    IconButton(
        onClick = { takePhoto(context, imageCapture) },
        modifier = Modifier
            .align(Alignment.BottomCenter)
            .padding(32.dp)
    ) {
        Icon(Icons.Default.PhotoCamera, contentDescription = "Take photo")
    }
}

takePhoto() extrahieren

Halten Sie Ihr Composable übersichtlich, indem Sie die Aufnahmelogik in eine Hilfsfunktion verschieben. Sie übernimmt den Kontext und den ImageCapture-Use-Case, erstellt die Ausgabeoptionen und ruft takePicture auf.

fun takePhoto(context: Context, imageCapture: ImageCapture) {
    val values = ContentValues().apply {
        put(MediaStore.MediaColumns.DISPLAY_NAME, "IMG_${System.currentTimeMillis()}")
        put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg")
    }
    val options = ImageCapture.OutputFileOptions.Builder(
        context.contentResolver,
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
        values
    ).build()

    imageCapture.takePicture(
        options,
        ContextCompat.getMainExecutor(context),
        object : ImageCapture.OnImageSavedCallback {
            override fun onImageSaved(o: ImageCapture.OutputFileResults) {}
            override fun onError(e: ImageCaptureException) {}
        }
    )
}

Blitz und Rotation

Zwei abschließende Anpassungen:

  • Blitz: Setzen Sie imageCapture.flashMode auf FLASH_MODE_ON, OFF oder AUTO.
  • Rotation: CameRX verwendet die Zielrotation, um das gespeicherte JPEG korrekt auszurichten. Aktualisieren Sie sie regelmäßig, damit die Ausrichtung stimmt.
imageCapture.flashMode = ImageCapture.FLASH_MODE_AUTO
// Update target rotation when the device rotates:
imageCapture.targetRotation = display.rotation

Alles zusammenführen

Der vollständige Fotoablauf sieht so aus: ImageCapture erstellen → zusammen mit der Vorschau binden → beim Tippen auf den Auslöser OutputFileOptions erstellen und takePicture aufrufen → onImageSaved / onError verarbeiten.

Damit haben Sie mit nur wenigen Zeilen eine vollständige Kamera, die Bilder in der Galerie speichert.

Kurzer Check

Vergewissern Sie sich, dass Sie den Ablauf der Fotoaufnahme verstanden haben.

Zusammenfassung

Sie können jetzt Fotos mit CameRX aufnehmen und speichern:

  • Erstellen Sie einen ImageCapture-Use-Case und binden Sie ihn zusammen mit der Vorschau.
  • Beschreiben Sie die Ausgabe mit ContentValues und MediaStore für Scoped Storage.
  • Rufen Sie takePicture() mit OutputFileOptions, einem Executor und einem OnImageSavedCallback auf.
  • Lesen Sie bei Erfolg savedUri aus und behandeln Sie bei einem Fehler ImageCaptureException.

Als Nächstes zeichnen Sie mit dem VideoCapture-Use-Case Videos auf.

Häufig gestellte Fragen

Ist die Lektion „Fotos aufnehmen“ kostenlos?

Ja — der vollständige Text von „Fotos aufnehmen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Android Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Android Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Fotos aufnehmen“?

Ein Bild aufnehmen und speichern Du übst Android Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Android Academy zu starten?

Keine Vorkenntnisse erforderlich. Android Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Fotos aufnehmen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Android Academy-Lektion Code schreiben und ausführen?

Ja. Jede Android Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Überblick über CameraX
  2. Eine Kameravorschau anzeigen
  3. Fotos aufnehmen
  4. Videos aufnehmen
← Zurück zu Android Academy