Android Academy · Pelajaran

Mengambil Foto

Ambil dan simpan gambar.

Pelajaran 3 dari 413 langkah

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.flashMode ke FLASH_MODE_ON, OFF, atau AUTO.
  • 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.rotation

Menyatukan 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 ImageCapture dan hubungkan dengan pratinjau.
  • Jelaskan keluaran menggunakan ContentValues dan MediaStore untuk penyimpanan terbatas cakupan.
  • Panggil takePicture() dengan OutputFileOptions, executor, dan OnImageSavedCallback.
  • Baca savedUri jika berhasil; tangani ImageCaptureException jika terjadi kesalahan.

Selanjutnya, Anda akan merekam video dengan use case VideoCapture.

Gratis untuk memulai

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.

Semua pelajaran dalam kursus ini

  1. Ikhtisar CameraX
  2. Menampilkan Pratinjau Kamera
  3. Mengambil Foto
  4. Merekam Video
← Kembali ke Android Academy