واجهة برمجة تطبيقات إضافات Camera2

ملاحظة: تشير هذه الصفحة إلى حزمة Camera2. ننصحك باستخدام CameraX، ما لم يتطلّب تطبيقك ميزات محدّدة منخفضة المستوى من Camera2. تتوافق كل من CameraX وCamera2 مع الإصدار 5.0 من نظام التشغيل Android (المستوى 21 من واجهة برمجة التطبيقات) والإصدارات الأحدث.

توفّر Camera2 واجهة برمجة تطبيقات للإضافات من أجل الوصول إلى الإضافات التي نفّذتها الشركات المصنّعة للأجهزة على أجهزة Android المختلفة. للاطّلاع على قائمة بأوضاع الإضافات المتوافقة، يُرجى الاطّلاع على إضافات الكاميرا.

للاطّلاع على قائمة بالأجهزة المتوافقة مع الإضافات، يُرجى مراجعة الأجهزة المتوافقة.

بنية الإضافات

توضّح الصورة التالية بنية إضافات الكاميرا.

الشكل 1: بنية إضافات الكاميرا

يمكن لتطبيق Camera2 استخدام الإضافات من خلال واجهة برمجة التطبيقات Camera2 API. توفّر واجهة برمجة التطبيقات Camera2 طرقًا للاستعلام عن الإضافات المتاحة، وضبط جلسة كاميرا للإضافة، والتواصل مع مكتبة المصنّع الأصلي للجهاز الخاصة بإضافات الكاميرا. يتيح ذلك لتطبيقك استخدام إضافات مثل "الوضع الليلي" أو "النطاق العالي الديناميكية" أو "تلقائي" أو "خلفية ضبابية" أو "تجميل الوجه".

اختبار جهاز كاميرا للتأكّد من توافقه مع واجهة Camera2 Extensions API

يتحقّق مقتطف الرمز التالي مما إذا كان الجهاز يتيح استخدام واجهة برمجة التطبيقات Camera2 Extensions. لا تتوافق الإضافات مع بعض الأجهزة، أو قد يتوافق الجهاز مع مجموعة فرعية من الإضافات. يعرض المقتطف قائمة بمعرّفات الكاميرات المتوافقة التي تتيح استخدام إضافات الكاميرا.

private fun getExtensionCameraIds(cameraManager: CameraManager): List<String> =
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        cameraManager.cameraIdList.filter { cameraId ->
            val characteristics = cameraManager.getCameraCharacteristics(cameraId)
            val extensionCharacteristics =
                cameraManager.getCameraExtensionCharacteristics(cameraId)
            val capabilities =
                characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)
            extensionCharacteristics.supportedExtensions.isNotEmpty() &&
                capabilities?.contains(
                    CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
                ) ?: false
        }
    } else emptyList()

إنشاء CameraExtensionSession باستخدام واجهة برمجة التطبيقات Camera2 Extensions API

تتيح لك واجهة برمجة التطبيقات Camera2 Extensions الوصول إلى بعض إضافات الكاميرا عند استخدامها مع الأجهزة المتوافقة. يعرض مقتطف الرمز التالي مثالاً على كيفية إنشاء CameraExtensionSession لاستخدام وضع "الالتقاط الليلي" في تطبيق Camera2 حالي.

private val captureCallbacks = object : CameraExtensionSession.ExtensionCaptureCallback() {
    // Implement Capture Callbacks.
}
private val extensionSessionStateCallback = object : CameraExtensionSession.StateCallback() {
    override fun onConfigured(session: CameraExtensionSession) {
        cameraExtensionSession = session
        try {
            val captureRequest =
                cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW).apply {
                    addTarget(previewSurface)
                }.build()
            session.setRepeatingRequest(
                captureRequest,
                Dispatchers.IO.asExecutor(),
                captureCallbacks
            )
        } catch (e: CameraAccessException) {
            Snackbar.make(
                previewView,
                "Failed to preview capture request",
                Snackbar.LENGTH_SHORT
            ).show()
            requireActivity().finish()
        }
    }

    override fun onClosed(session: CameraExtensionSession) {
        super.onClosed(session)
        cameraDevice.close()
    }

    override fun onConfigureFailed(session: CameraExtensionSession) {
        Snackbar.make(
            previewView,
            "Failed to start camera extension preview",
            Snackbar.LENGTH_SHORT
        ).show()
        requireActivity().finish()
    }
}

private fun startExtensionSession() {
    val outputConfig = arrayListOf(
        OutputConfiguration(stillImageReader.surface),
        OutputConfiguration(previewSurface)
    )
    val extensionConfiguration = ExtensionSessionConfiguration(
        CameraExtensionCharacteristics.EXTENSION_NIGHT,
        outputConfig,
        Dispatchers.IO.asExecutor(),
        extensionSessionStateCallback
    )
    cameraDevice.createExtensionSession(extensionConfiguration)
}

مراجع إضافية

لمزيد من المعلومات، يُرجى الاطّلاع على CameraExtensionCharacteristics وعرض نماذج واجهة برمجة التطبيقات Camera2 Extensions API العامة.