Mengambil Foto
Ambil dan simpan gambar.
Mengambil Foto adalah pelajaran Android Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Android Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Android Academy mencakup 4 pelajaran total.
Mengambil Foto
Setelah pratinjau tampil di layar, langkah berikutnya adalah mengambil foto. CameRX menangani hal ini dengan kasus penggunaan ImageCapture.
Anda akan mengikat ImageCapture bersama pratinjau, lalu memanggil takePicture() saat pengguna mengetuk tombol rana, dan menyimpan hasilnya ke galeri perangkat.
Membangun Kasus Penggunaan ImageCapture
ImageCapture dikonfigurasi dengan builder. Salah satu opsi yang berguna adalah mode pengambilan, yang menyeimbangkan latensi dan kualitas:
CAPTURE_MODE_MINIMIZE_LATENCY—rana cepat.CAPTURE_MODE_MAXIMIZE_QUALITY—gambar terbaik, sedikit lebih lambat.
val imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.build()Mengikat Preview + ImageCapture
Anda dapat mengikat beberapa kasus penggunaan sekaligus. Berikan preview dan imageCapture kepada bindToLifecycle agar kamera menampilkan umpan langsung dan siap mengambil foto.
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
lifecycleOwner,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
imageCapture
)Tempat Penyimpanan: MediaStore
Cara modern yang sesuai dengan penyimpanan terbatas untuk menyimpan foto adalah melalui MediaStore. Anda menjelaskan file (nama, jenis MIME, folder) dengan ContentValues, lalu membiarkan sistem menempatkannya di koleksi Pictures bersama.
Cara ini dapat digunakan tanpa izin lama WRITE_EXTERNAL_STORAGE di 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")
}Opsi Output
Untuk memberi tahu CameraX tempat menulis JPEG, buat OutputFileOptions dari resolver konten, URI koleksi tujuan, dan ContentValues Anda.
val outputOptions = ImageCapture.OutputFileOptions
.Builder(
context.contentResolver,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
contentValues
)
.build()Memanggil takePicture()
Sekarang jalankan pengambilan gambar. takePicture() menerima opsi output, sebuah Executor, dan callback. CameRX melaporkan keberhasilan atau kesalahan secara asinkron.
Gunakan ContextCompat.getMainExecutor(context) agar callback berjalan di thread utama.
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.
}
}
)Menangani Hasil
Jika berhasil, OutputFileResults.savedUri memberikan URI gambar yang disimpan. Anda dapat menampilkannya (dengan Coil), membagikannya, atau menampilkan Snackbar untuk mengonfirmasi penyimpanan.
Jika terjadi kesalahan, ImageCaptureException memberi tahu penyebabnya — catat kesalahan tersebut dan beri tahu pengguna.
override fun onImageSaved(output: ImageCapture.OutputFileResults) {
val uri = output.savedUri ?: return
Toast.makeText(context, "Saved: $uri", Toast.LENGTH_SHORT).show()
}Menghubungkan Tombol Rana
Di Compose, letakkan tombol rana di atas pratinjau menggunakan Box. Naikkan referensi ImageCapture agar onClick tombol dapat memanggil 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")
}
}Memisahkan takePhoto()
Jaga agar composable tetap rapi dengan memindahkan logika pengambilan gambar ke helper. Helper ini menerima context dan use case ImageCapture, membuat opsi keluaran, lalu memanggil 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) {}
}
)
}Lampu Kilat dan Rotasi
Dua sentuhan akhir:
- Lampu kilat: tetapkan
imageCapture.flashModekeFLASH_MODE_ON,OFF, atauAUTO. - Rotasi: CameRX menggunakan rotasi target untuk mengorientasikan JPEG yang disimpan dengan benar; terus perbarui nilainya agar orientasi tetap akurat.
imageCapture.flashMode = ImageCapture.FLASH_MODE_AUTO
// Update target rotation when the device rotates:
imageCapture.targetRotation = display.rotationMenyatukan Semuanya
Alur lengkap foto adalah: buat ImageCapture → hubungkan dengan pratinjau → saat rana diketuk, buat OutputFileOptions dan panggil takePicture → tangani onImageSaved / onError.
Dengan demikian, Anda memiliki kamera lengkap yang menyimpan ke galeri hanya dengan beberapa baris kode.
Pemeriksaan Singkat
Pastikan Anda memahami alur pengambilan foto.
Rangkuman
Sekarang Anda dapat mengambil dan menyimpan foto dengan CameRX:
- Buat use case
ImageCapturedan hubungkan dengan pratinjau. - Jelaskan keluaran menggunakan
ContentValuesdanMediaStoreuntuk penyimpanan terbatas cakupan. - Panggil
takePicture()denganOutputFileOptions, executor, danOnImageSavedCallback. - Baca
savedUrijika berhasil; tanganiImageCaptureExceptionjika terjadi kesalahan.
Selanjutnya, Anda akan merekam video dengan use case VideoCapture.
Belajar Kotlin dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 36
- Pelajaran
- 152
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mengambil Foto” gratis?
Ya — teks lengkap “Mengambil Foto” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Android Academy, upgrade ke CoddyKit PRO. Kursus Android Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Mengambil Foto”?
Ambil dan simpan gambar. Kamu berlatih Android Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Android Academy?
Tidak diperlukan pengalaman sebelumnya. Android Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Mengambil Foto” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Android Academy ini?
Ya. Setiap pelajaran Android Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.