0Pricing
Android Academy · درس

التقاط الصور

التقط صورة واحفظها

التقاط الصور درس مجاني في Android Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Android Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Android Academy 4 دروس في المجموع.

التقاط صورة

بعد ظهور المعاينة على الشاشة، تتمثل الخطوة التالية في التقاط صورة. يتولى CameRX ذلك باستخدام حالة الاستخدام ImageCapture.

ستربط ImageCapture إلى جانب المعاينة، ثم تستدعي takePicture() عندما ينقر المستخدم على زر الغالق، وتحفظ النتيجة في معرض الجهاز.

إنشاء حالة استخدام ImageCapture

تُضبط ImageCapture باستخدام builder. ومن الخيارات المفيدة وضع الالتقاط، الذي يوازن بين زمن الاستجابة والجودة:

  • CAPTURE_MODE_MINIMIZE_LATENCY — غالق سريع.
  • CAPTURE_MODE_MAXIMIZE_QUALITY — أفضل صورة مع بطء طفيف.
val imageCapture = ImageCapture.Builder()
    .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
    .build()

ربط Preview وImageCapture

يمكنك ربط عدة حالات استخدام في الوقت نفسه. مرّر كلًا من preview وimageCapture إلى bindToLifecycle حتى تخدم الكاميرا البث المباشر وتكون جاهزة لالتقاط صورة.

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

مكان الحفظ: MediaStore

الطريقة الحديثة المتوافقة مع التخزين المحصور لحفظ صورة هي استخدام MediaStore. صِف الملف (الاسم ونوع MIME والمجلد) باستخدام ContentValues، ودَع النظام يضعه في مجموعة Pictures المشتركة.

يعمل هذا من دون إذن WRITE_EXTERNAL_STORAGE القديم على 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")
}

خيارات الإخراج

لتحديد مكان كتابة ملف JPEG لـ CameraX، أنشئ OutputFileOptions من محلل المحتوى وعنوان URI لمجموعة الوجهة وContentValues الخاص بك.

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

استدعاء takePicture()

حان وقت تشغيل الالتقاط. يأخذ takePicture() خيارات الإخراج وExecutor وcallback. ويبلّغ CameRX بالنجاح أو الخطأ بشكل غير متزامن.

استخدم ContextCompat.getMainExecutor(context) حتى يعمل callback على الخيط الرئيسي.

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

التعامل مع النتيجة

عند النجاح، توفّر OutputFileResults.savedUri معرّف URI للصورة المحفوظة. يمكنكم عرضها باستخدام Coil، أو مشاركتها، أو إظهار Snackbar لتأكيد الحفظ.

عند حدوث خطأ، توضّح ImageCaptureException ما الذي حدث — سجّلوا الخطأ وأبلغوا المستخدم.

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

توصيل زر الغالق

في Compose، ضعوا زر الغالق فوق المعاينة باستخدام Box. ارفعوا مرجع ImageCapture إلى مستوى أعلى حتى يتمكّن onClick الخاص بالزر من استدعاء 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")
    }
}

استخراج takePhoto()

حافظوا على نظافة composable بنقل منطق الالتقاط إلى دالة مساعدة. تستقبل الدالة السياق وحالة الاستخدام ImageCapture، وتنشئ خيارات الإخراج ثم تستدعي 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) {}
        }
    )
}

الفلاش والدوران

خطوتان نهائيتان:

  • الفلاش: اضبطوا imageCapture.flashMode على FLASH_MODE_ON أو OFF أو AUTO.
  • الدوران: يستخدم CameRX الدوران المستهدف لتوجيه JPEG المحفوظ بالشكل الصحيح؛ حافظوا على تحديثه لضمان دقة الاتجاه.
imageCapture.flashMode = ImageCapture.FLASH_MODE_AUTO
// Update target rotation when the device rotates:
imageCapture.targetRotation = display.rotation

جمع كل الأجزاء

يتكوّن تدفق الصور الكامل من الخطوات التالية: إنشاء ImageCapture ← ربطه بالمعاينة ← عند النقر على الغالق، إنشاء OutputFileOptions واستدعاء takePicture ← معالجة onImageSaved / onError.

بهذا تحصلون على كاميرا كاملة تحفظ الصور في المعرض باستخدام بضعة أسطر فقط.

تحقق سريع

تأكدوا من فهمكم لتدفق التقاط الصور.

مراجعة

يمكنكم الآن التقاط الصور وحفظها باستخدام CameRX:

  • أنشئوا حالة استخدام ImageCapture واربطوها بالمعاينة.
  • حدّدوا الإخراج باستخدام ContentValues وMediaStore للتخزين المحدد النطاق.
  • استدعوا takePicture() باستخدام OutputFileOptions وexecutor وOnImageSavedCallback.
  • اقرؤوا savedUri عند النجاح، وتعاملوا مع ImageCaptureException عند حدوث خطأ.

بعد ذلك، ستسجّلون الفيديو باستخدام حالة الاستخدام VideoCapture.

الأسئلة الشائعة

هل درس «التقاط الصور» مجاني؟

نعم — نص درس «التقاط الصور» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Android Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Android Academy 4 دروس في المجموع.

ماذا ستتعلم في «التقاط الصور»؟

التقط صورة واحفظها تتمرن على Android Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Android Academy؟

لا تُشترط خبرة سابقة. Android Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «التقاط الصور»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Android Academy هذا؟

نعم. كل درس في Android Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. نظرة عامة على CameraX
  2. عرض معاينة الكاميرا
  3. التقاط الصور
  4. تسجيل الفيديو
← العودة إلى Android Academy