Android Academy · Lektion

Tagning af billeder

Optag og gem et billede.

Lektion 3 af 413 trin

Tagning af billeder er en gratis Android Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Android Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Android Academy-kurset indeholder 4 lektioner i alt.

Optagelse af et billede

Når du har en forhåndsvisning på skærmen, er næste trin at tage et billede. CameRX håndterer dette med anvendelsestilfældet ImageCapture.

Du binder ImageCapture sammen med forhåndsvisningen og kalder derefter takePicture(), når brugeren trykker på udløserknappen, hvorefter resultatet gemmes i enhedens galleri.

Opbygning af anvendelsestilfældet ImageCapture

ImageCapture konfigureres med en builder. En nyttig indstilling er optagelsestilstanden, som afvejer forsinkelse mod kvalitet:

  • CAPTURE_MODE_MINIMIZE_LATENCY — hurtig udløser.
  • CAPTURE_MODE_MAXIMIZE_QUALITY — bedste billede, en smule langsommere.
val imageCapture = ImageCapture.Builder()
    .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
    .build()

Binding af Preview + ImageCapture

Du kan binde flere anvendelsestilfælde på én gang. Send både preview og imageCapture til bindToLifecycle, så kameraet leverer den direkte videostrøm og er klar til at tage et billede.

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

Hvor skal billedet gemmes: MediaStore

Den moderne måde at gemme et billede på, som fungerer godt med begrænset lageradgang, er via MediaStore. Du beskriver filen (navn, MIME-type og mappe) med ContentValues og lader systemet placere den i den delte samling Pictures.

Det fungerer uden den ældre tilladelse WRITE_EXTERNAL_STORAGE på Android 10+.

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")
}

Outputindstillinger

For at fortælle CameraX, hvor JPEG-filen skal skrives, skal du oprette OutputFileOptions ud fra indholdsresolveren, URI'en til målsamlingen og dine ContentValues.

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

Kald af takePicture()

Udløs nu optagelsen. takePicture() tager outputindstillingerne, en Executor og et callback. CameRX rapporterer succes eller fejl asynkront.

Brug ContextCompat.getMainExecutor(context), så callbacket kører på hovedtråden.

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.
        }
    }
)

Håndtering af resultatet

Ved succes indeholder OutputFileResults.savedUri URI'en til det gemte billede. Du kan vise det med Coil, dele det eller vise en Snackbar, der bekræfter, at det er gemt.

Ved en fejl fortæller ImageCaptureException, hvad der gik galt — log fejlen, og informer brugeren.

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

Tilslutning af en udløserknap

I Compose kan du lægge en udløserknap oven på din forhåndsvisning ved hjælp af en Box. Løft referencen til ImageCapture, så knappens onClick kan kalde takePhoto.

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")
    }
}

Udtrækning af takePhoto()

Hold din composable ren ved at flytte optagelseslogikken til en hjælpefunktion. Den modtager konteksten og ImageCapture-use casen, opbygger outputindstillingerne og kalder takePicture.

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 og rotation

To sidste justeringer:

  • Blitz: Indstil imageCapture.flashMode til FLASH_MODE_ON, OFF eller AUTO.
  • Rotation: CameRX bruger målrotationen til at orientere den gemte JPEG-fil korrekt. Hold den opdateret for at få den rigtige orientering.
imageCapture.flashMode = ImageCapture.FLASH_MODE_AUTO
// Update target rotation when the device rotates:
imageCapture.targetRotation = display.rotation

Samling af det hele

Det fulde fotoforløb er: opbyg ImageCapture → bind den sammen med forhåndsvisningen → opbyg OutputFileOptions, og kald takePicture, når der trykkes på udløseren → håndter onImageSaved / onError.

Det giver et komplet kamera, der gemmer i galleriet, på blot en håndfuld linjer.

Hurtigt tjek

Bekræft, at du forstår fotoforløbet.

Opsummering

Du kan nu tage og gemme billeder med CameRX:

  • Opret en ImageCapture-use case, og bind den sammen med forhåndsvisningen.
  • Beskriv outputtet med ContentValues og MediaStore til scoped storage.
  • Kald takePicture() med OutputFileOptions, en executor og en OnImageSavedCallback.
  • Læs savedUri ved succes, og håndter ImageCaptureException ved fejl.

Dernæst optager du video med VideoCapture-use casen.

Gratis at komme i gang

Lær Kotlin med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
36
Lektioner
152

Ofte stillede spørgsmål

Er lektionen “Tagning af billeder” gratis?

Ja — alle 3 lektioner i læringssporet Android Academy, inklusive “Tagning af billeder”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Android Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Tagning af billeder”?

Optag og gem et billede. Du øver dig i Android Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Android Academy?

Der kræves ingen tidligere erfaring. Android Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “Tagning af billeder”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Android Academy-lektion?

Ja. Alle Android Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Oversigt over CameraX
  2. Visning af en kameraforhåndsvisning
  3. Tagning af billeder
  4. Optagelse af video
← Tilbage til Android Academy