نظرة عامة على CameraX
لماذا تستخدم CameraX بدل واجهات الكاميرا القديمة
نظرة عامة على CameraX درس مجاني في Android Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Android Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Android Academy 4 دروس في المجموع.
لماذا CameraX؟
كانت إضافة كاميرا إلى تطبيق Android أمرًا شاقًا. كانت واجهة برمجة التطبيقات القديمة android.hardware.camera2 قوية، لكنها مطوّلة للغاية وتتصرف بشكل مختلف على آلاف الأجهزة المستخدمة فعليًا.
CameraX مكتبة من Jetpack تعمل فوق Camera2 وتوفر واجهة برمجة تطبيقات بسيطة ومتسقة وواعية بدورة الحياة. في هذه الدورة ستستخدم CameraX لعرض معاينة مباشرة والتقاط الصور وتسجيل الفيديو.
ما الذي يحلّه CameraX
صُمّم CameraX حول ثلاثة أهداف:
- سهولة الاستخدام — تعليمات برمجية تمهيدية أقل بكثير من Camera2.
- الاتساق — تختبره Google على مختبر كبير من الأجهزة، لذلك تتصرف الأجهزة غير المعتادة بطريقة متوقعة.
- الوعي بدورة الحياة — تبدأ الكاميرا وتتوقف تلقائيًا مع دورة حياة شاشتك، فلا تتسبب في تسريب مورد الكاميرا.
أنت تصف ما تريده (معاينة أو صورة أو فيديو)، ويتولى CameraX تحديد كيفية تنفيذه على الجهاز الحالي.
حالات الاستخدام الأساسية الثلاث
يعتمد CameraX على حالات الاستخدام. وحالة الاستخدام جزء مستقل من وظائف الكاميرا. والحالات الثلاث الرئيسية هي:
Preview— عرض ما تراه الكاميرا على الشاشة.ImageCapture— التقاط صورة.VideoCapture— تسجيل فيديو.
تنشئ حالات الاستخدام التي تحتاج إليها وتربطها بالكاميرا.
// You create the use cases you need:
val preview = Preview.Builder().build()
val imageCapture = ImageCapture.Builder().build()
// Later you bind them to a lifecycle and a camera.إضافة التبعيات
يأتي CameraX في عدة artifacts. وتضيفها إلى build.gradle.kts الخاص بالوحدة. ويضم الإعداد المعتاد المكتبة الأساسية وواجهة camera2 الخلفية وتكامل دورة الحياة وأدوات العرض.
حافظ على استخدام الإصدار نفسه لجميع artifacts الخاصة بـ CameraX لتجنب التعارضات.
dependencies {
val cameraxVersion = "1.3.4"
implementation("androidx.camera:camera-core:$cameraxVersion")
implementation("androidx.camera:camera-camera2:$cameraxVersion")
implementation("androidx.camera:camera-lifecycle:$cameraxVersion")
implementation("androidx.camera:camera-view:$cameraxVersion")
implementation("androidx.camera:camera-video:$cameraxVersion")
}التصريح بالأذونات
لاستخدام الكاميرا، يجب التصريح بإذن CAMERA في AndroidManifest.xml. وإذا كنت تسجل فيديو أيضًا، فقد تحتاج إلى RECORD_AUDIO.
هذه أذونات أثناء التشغيل — لا يكفي التصريح بها؛ بل يجب أيضًا طلبها من المستخدم أثناء التشغيل (وهو ما ستتناوله دروس لاحقة).
<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-feature
android:name="android.hardware.camera.any"
android:required="false" />موفّر الكاميرا
نقطة الدخول إلى CameraX هي ProcessCameraProvider. فهو يربط حالات الاستخدام بالكاميرا وبدورة حياة شاشتك.
تحصل عليه بشكل غير متزامن باستخدام getInstance()، الذي يعيد ListenableFuture. ومن Kotlin يمكنك استخدام await() داخله في coroutine.
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.camera.core.ExperimentalGetImage
suspend fun Context.getCameraProvider(): ProcessCameraProvider {
return ProcessCameraProvider.getInstance(this).await()
}ربط حالات الاستخدام بدورة الحياة
بعد حصولك على الموفّر، تربط حالات الاستخدام بـ LifecycleOwner وCameraSelector (الكاميرا الأمامية أو الخلفية).
وبما أن الربط يراعي دورة الحياة، يفتح CameraX الكاميرا تلقائيًا عندما تكون شاشتك مرئية ويغلقها عندما لا تكون كذلك — من دون الحاجة إلى تنظيف يدوي.
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
lifecycleOwner,
cameraSelector,
preview,
imageCapture
)اختيار كاميرا
يحدد CameraSelector الكاميرا الفعلية التي سيستخدمها CameraX. والكاميرتان الأكثر شيوعًا هما الكاميرا الخلفية الافتراضية والكاميرا الأمامية الافتراضية.
يمكنك أيضًا إنشاء محدد مخصص لفرض خصائص معينة، لكن الإعدادات الافتراضية تناسب كل تطبيق تقريبًا.
// Back camera (most common for photos)
val back = CameraSelector.DEFAULT_BACK_CAMERA
// Front camera (selfies, video calls)
val front = CameraSelector.DEFAULT_FRONT_CAMERA
// Toggle between them by swapping the selector and re-binding.PreviewView: سطح العرض
يعرض CameraX المعاينة المباشرة داخل PreviewView. وهو View عادي في Android يتولى إدارة السطح والتحجيم والتدوير نيابةً عنك.
في Jetpack Compose، تُضمّنه باستخدام AndroidView، الذي يتيح لك وضع View تقليدي داخل composable. ستنفذ هذا الربط بالكامل في الدرس التالي.
AndroidView(
factory = { context ->
PreviewView(context).apply {
scaleType = PreviewView.ScaleType.FILL_CENTER
}
},
modifier = Modifier.fillMaxSize()
)الوعي بدورة الحياة عمليًا
أكبر فائدة عملية لـ CameraX هي الوعي بدورة الحياة. مع Camera2، كان عليك فتح الكاميرا يدويًا في onResume وتحريرها في onPause، وكان نسيان ذلك يؤدي إلى أعطال أو بقاء الكاميرا عالقة.
مع CameraX، بمجرد استخدام bindToLifecycle، يتولى الإطار كل ذلك. فعندما ينتقل المستخدم بعيدًا، تُحرر الكاميرا تلقائيًا؛ وعندما يعود، تُفتح من جديد.
// No manual open/close needed.
// bindToLifecycle ties the camera to the screen's
// lifecycle, so it follows onStart/onStop for you.
cameraProvider.bindToLifecycle(lifecycleOwner, selector, preview)نموذجك الذهني
احتفظ بهذا التصور لبقية الدورة:
- احصل على
ProcessCameraProvider. - أنشئ حالات الاستخدام التي تحتاج إليها (
PreviewوImageCaptureوVideoCapture). - اختر
CameraSelector. - استخدم
bindToLifecycleلربط كل شيء.
كل ميزة في CameraX ليست إلا تنويعًا لهذه الخطوات الأربع.
تحقق سريع
اختبر فهمك لأساسيات CameraX.
مراجعة
أصبحت تفهم الآن الصورة العامة لـ CameraX:
- يغلّف CameraX واجهة Camera2 بواجهة أبسط وأكثر اتساقًا ووعيًا بدورة الحياة.
- يعتمد على حالات الاستخدام:
PreviewوImageCaptureوVideoCapture. - تضيف artifacts الخاصة بـ CameraX، وتصرّح بإذن
CAMERA، وتحصل علىProcessCameraProvider، ثم تستخدمbindToLifecycle. - يختار
CameraSelectorالكاميرا الأمامية أو الخلفية، بينما يعرضPreviewViewالبث.
بعد ذلك، ستربط معاينة مباشرة حقيقية على الشاشة.
الأسئلة الشائعة
هل درس «نظرة عامة على CameraX» مجاني؟
نعم — نص درس «نظرة عامة على CameraX» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Android Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Android Academy 4 دروس في المجموع.
ماذا ستتعلم في «نظرة عامة على CameraX»؟
لماذا تستخدم CameraX بدل واجهات الكاميرا القديمة تتمرن على Android Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Android Academy؟
لا تُشترط خبرة سابقة. Android Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «نظرة عامة على CameraX»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Android Academy هذا؟
نعم. كل درس في Android Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- نظرة عامة على CameraX
- عرض معاينة الكاميرا
- التقاط الصور
- تسجيل الفيديو