Tagning af billeder
Optag og gem et billede.
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.flashModetilFLASH_MODE_ON,OFFellerAUTO. - 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.rotationSamling 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
ContentValuesogMediaStoretil scoped storage. - Kald
takePicture()medOutputFileOptions, en executor og enOnImageSavedCallback. - Læs
savedUrived succes, og håndterImageCaptureExceptionved fejl.
Dernæst optager du video med VideoCapture-use casen.
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
- Oversigt over CameraX
- Visning af en kameraforhåndsvisning
- Tagning af billeder
- Optagelse af video