0Pricing
Android Academy · Ders

Fotoğraf Çekme

Bir görüntü yakalayıp kaydedin.

Fotoğraf Çekme, CoddyKit'te ücretsiz bir Android Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Android Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Android Academy kursu toplamda 4 dersten oluşur.

Fotoğraf Çekme

Ekranda bir önizleme varken sıradaki adım fotoğraf çekmektir. CameRX bunu ImageCapture kullanım senaryosuyla yönetir.

ImageCapture'ı önizlemeyle birlikte bağlayacak, ardından kullanıcı deklanşör düğmesine dokunduğunda takePicture() çağrısını yapıp sonucu cihazın galerisinde saklayacaksınız.

ImageCapture Kullanım Senaryosunu Oluşturma

ImageCapture, bir oluşturucu ile yapılandırılır. Yararlı seçeneklerden biri, gecikme ile kalite arasında tercih yapan çekim kipidir:

  • CAPTURE_MODE_MINIMIZE_LATENCY — hızlı deklanşör.
  • CAPTURE_MODE_MAXIMIZE_QUALITY — en iyi görüntü, biraz daha yavaş.
val imageCapture = ImageCapture.Builder()
    .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
    .build()

Preview + ImageCapture'ı Bağlama

Birden fazla kullanım senaryosunu aynı anda bağlayabilirsiniz. Kameranın canlı görüntü akışını sunması ve fotoğraf çekmeye hazır olması için hem preview hem de imageCapture öğesini bindToLifecycle'a geçirin.

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

Nereye Kaydedilir: MediaStore

Bir fotoğrafı kaydetmenin modern ve kapsamlı depolama ile uyumlu yolu MediaStore kullanmaktır. Dosyayı (ad, MIME türü, klasör) ContentValues ile tanımlar ve sistemin onu paylaşılan Pictures koleksiyonuna yerleştirmesine izin verirsiniz.

Bu yöntem, Android 10 ve sonraki sürümlerde eski WRITE_EXTERNAL_STORAGE izni olmadan çalışır.

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

Çıktı Seçenekleri

CameraX'e JPEG dosyasını nereye yazacağını bildirmek için içerik çözümleyiciden, hedef koleksiyon URI'sinden ve ContentValues'ınızdan bir OutputFileOptions oluşturun.

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

takePicture() Çağrısını Yapma

Şimdi çekimi başlatın. takePicture() çıktı seçeneklerini, bir Executor'ı ve bir geri çağırmayı alır. CameRX başarıyı veya hatayı eşzamansız olarak bildirir.

Geri çağırmanın ana iş parçacığında çalışması için ContextCompat.getMainExecutor(context) kullanın.

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

Sonucu İşleme

Başarılı olduğunda OutputFileResults.savedUri, kaydedilen görüntünün URI'sini verir. Bu görüntüyü (Coil ile) görüntüleyebilir, paylaşabilir veya kaydedildiğini onaylayan bir Snackbar gösterebilirsiniz.

Hata durumunda ImageCaptureException neyin yanlış gittiğini belirtir; hatayı günlüğe kaydedip kullanıcıyı bilgilendirin.

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

Deklanşör Düğmesini Bağlama

Compose'ta, Box kullanarak önizlemenin üzerine bir deklanşör düğmesi yerleştirin. Düğmenin onClick işlevinin takePhoto çağrısını yapabilmesi için ImageCapture başvurusunu üst kapsama taşıyın.

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() İşlevini Ayırma

Yakalama mantığını bir yardımcıya taşıyarak composable'ınızı sade tutun. Bu yardımcı, bağlamı ve ImageCapture kullanım senaryosunu alır, çıktı seçeneklerini oluşturur ve takePicture çağrısını yapar.

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

Flaş ve Döndürme

Son iki dokunuş:

  • Flaş: imageCapture.flashMode değerini FLASH_MODE_ON, OFF veya AUTO olarak ayarlayın.
  • Döndürme: CameRX, kaydedilen JPEG'i doğru yönde hizalamak için hedef döndürme değerini kullanır; doğru yönlendirme için bu değeri güncel tutun.
imageCapture.flashMode = ImageCapture.FLASH_MODE_AUTO
// Update target rotation when the device rotates:
imageCapture.targetRotation = display.rotation

Hepsini Bir Araya Getirme

Tam fotoğraf akışı şöyledir: ImageCapture oluşturun → önizlemeyle bağlayın → deklanşöre dokunulduğunda OutputFileOptions oluşturup takePicture çağrısını yapın → onImageSaved / onError işlemlerini gerçekleştirin.

Böylece yalnızca birkaç satırla galeriye kaydeden eksiksiz bir kamera elde edersiniz.

Hızlı Kontrol

Fotoğraf yakalama akışını anladığınızı doğrulayın.

Özet

Artık CameRX ile fotoğraf çekip kaydedebilirsiniz:

  • Bir ImageCapture kullanım senaryosu oluşturun ve önizlemeyle bağlayın.
  • Kapsamlı depolama için çıktıyı ContentValues ve MediaStore ile tanımlayın.
  • Bir OutputFileOptions, yürütücü ve OnImageSavedCallback ile takePicture() çağrısını yapın.
  • Başarılı olduğunda savedUri değerini okuyun; hata durumunda ImageCaptureException işlemini gerçekleştirin.

Sırada, VideoCapture kullanım senaryosuyla video kaydedeceksiniz.

Sıkça Sorulan Sorular

“Fotoğraf Çekme” dersi ücretsiz mi?

Evet — “Fotoğraf Çekme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Android Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Android Academy kursu toplamda 4 dersten oluşur.

“Fotoğraf Çekme” dersinde ne öğreneceğim?

Bir görüntü yakalayıp kaydedin. Android Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Android Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Android Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Fotoğraf Çekme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Android Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Android Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. CameraX'e Genel Bakış
  2. Kamera Önizlemesi Gösterme
  3. Fotoğraf Çekme
  4. Video Kaydetme
← Android Academy Sayfasına Dön