تفعيل الكاميرات التي يمكن استخدامها من خلال عدة أجهزة

يمكنك السماح لعدة أجهزة عميل بالوصول إلى كاميرا في الوقت نفسه. لإجراء ذلك، استخدِم واجهات برمجة التطبيقات الخاصة بنظام Java وAndroid NDK الموضّحة في هذه الصفحة لمشاركة إذن الوصول إلى برامج الكاميرا على النظام.

  • العميل الأساسي: العميل الذي يحظى بأعلى أولوية بين العملاء المشترَكين. يمكن للعميل الأساسي إنشاء طلبات تسجيل وتعديل مَعلمات التسجيل.

  • العميل الثانوي: جميع العملاء المشترَكين الآخرين هم عملاء ثانويون. لا يمكن للعملاء الثانويين إنشاء طلبات تسجيل أو تعديل مَعلمات التسجيل. يمكن للعملاء الثانويين إرسال طلبات لبدء البث أو إيقافه فقط.

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

ضبط جلسة مشترَكة

لمشاركة جهاز كاميرا، يجب توفير إعدادات الجلسة المشتركة في الملف المسمّى shared_session_config.xml والموجود في /system_ext/etc/. في نموذج الرمز هذا، يتيح معرّف الكاميرا 0 مشاركة الكاميرا مع إعداد يتضمّن بثَّين، ImageReader وSurfaceView.

<SharedCameraSessionConfigurations colorSpace="-1">
    <!-- colorSpace: ANDROID_REQUEST_AVAILABLE_COLOR_SPACE_PROFILES_MAP_UNSPECIFIED -->
    <SharedCameraSessionConfiguration cameraId="0">
        <!-- First OutputConfiguration: All optional fields are provided -->
        <OutputConfiguration>
            <!-- surfaceType: SURFACE_TYPE_IMAGE_READER -->
            <surfaceType>4</surfaceType>
            <width>1920</width>
            <height>1080</height>
            <!-- physicalCameraId is omitted; defaults to "" -->
            <!-- streamUseCase: ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT -->
            <streamUseCase>0</streamUseCase>
            <!-- timestampBase: TIMESTAMP_BASE_DEFAULT -->
            <timestampBase>0</timestampBase>
            <!-- mirrorMode: MIRROR_MODE_AUTO -->
            <mirrorMode>0</mirrorMode>
            <useReadoutTimestamp>0</useReadoutTimestamp>
            <!-- format: HAL_PIXEL_FORMAT_RGBA_8888 -->
            <format>1</format>
            <!-- usage: AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN -->
            <usage>3</usage>
            <!-- dataSpace: HAL_DATASPACE_UNKNOWN -->
            <dataSpace>0</dataSpace>
        </OutputConfiguration>
        <!-- Second OutputConfiguration: All optional fields are provided -->
        <OutputConfiguration>
            <!-- surfaceType: SURFACE_TYPE_SURFACE_VIEW -->
            <surfaceType>0</surfaceType>
            <width>1920</width>
            <height>1080</height>
            <!-- physicalCameraId is omitted; defaults to "" -->
            <!-- streamUseCase: ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT -->
            <streamUseCase>0</streamUseCase>
            <!-- timestampBase: TIMESTAMP_BASE_DEFAULT -->
            <timestampBase>0</timestampBase>
            <!-- mirrorMode: MIRROR_MODE_AUTO -->
            <mirrorMode>0</mirrorMode>
            <useReadoutTimestamp>0</useReadoutTimestamp>
            <!-- format: HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED -->
            <format>34</format>
            <!-- usage: AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE|AHARDWAREBUFFER_USAGE_COMPOSER_OVERLAY -->
            <usage>256|2048</usage>
            <!-- dataSpace: HAL_DATASPACE_UNKNOWN -->

            <dataSpace>0</dataSpace>
        </OutputConfiguration>
      </SharedCameraSessionConfiguration>
</SharedCameraSessionConfigurations>

لطلب البحث عن إعدادات جلسة مشتركة، تستخدم البرامج CameraCharacteristics لـ SHARED_SESSION_CONFIGURATION. يجب أن تستخدم البرامج التي تصل إلى الكاميرا في الوضع المشترَك إعدادات الجلسة المشترَكة. عندما لا يتطابق إعداد الجلسة الذي يمرره أحد العملاء مع إعداد الجلسة المشتركة، يتعذّر إجراء مكالمة createCaptureSession.

واجهات برمجة تطبيقات Java

توفّر CameraManager وCameraDevice واجهات برمجة تطبيقات لفتح الكاميرات في وضع المشاركة.

واجهات برمجة تطبيقات CameraManager

توفّر CameraManager واجهات برمجة التطبيقات التالية:

  • isCameraDeviceSharingSupported: يستخدم العملاء واجهة برمجة التطبيقات هذه لتحديد ما إذا كانت الكاميرا تتوافق مع وضع المشاركة.

  • openSharedCamera: إذا كانت الكاميرا تتيح وضع المشاركة، تستخدم التطبيقات هذا الرمز البرمجي لواجهة برمجة التطبيقات لفتح الكاميرا في وضع المشاركة.

واجهات برمجة تطبيقات CameraDevice.StateCallback

توفّر CameraDevice.StateCallback واجهات برمجة التطبيقات التالية:

  • onOpenedInSharedMode: يتلقّى العملاء رد الاتصال هذا عند فتح الكاميرا في الوضع المشترك. يشير برنامج معالجة النتائج إلى ما إذا كان العميل هو العميل الأساسي أو الثانوي.

  • onClientSharedAccessPriorityChanged: عند فتح جلسة مشترَكة، يتم تشغيل برنامج معالجة الأخطاء هذا عند تغيير أولوية أحد العملاء لأنّ عميلاً ذا أولوية أعلى فتح الكاميرا نفسها أو أغلقها.

CameraSharedCaptureSession

يمثّل الفئة CameraSharedCaptureSession جلسة تسجيل مشتركة. في وضع الكاميرا المشتركة، يجب أن يستخدم العميل الذي ينشئ جلسة نوع الجلسة SESSION_SHARED.

عندما ينشئ النظام جلسة، يتم تحويل CameraCaptureSession إلى CameraSharedCaptureSession.

لا يمكن للعملاء الثانويين استخدام createCaptureRequest. بدلاً من ذلك، تستخدم التطبيقات الثانوية واجهة برمجة التطبيقات startStreaming لبدء البث على مساحات عرض محدّدة، وواجهة برمجة التطبيقات stopStreaming لإيقاف البث.

واجهات برمجة التطبيقات في Android NDK

تستخدم التطبيقات المضمّنة واجهات برمجة التطبيقات هذه في حزمة تطوير البرامج الأصلية (NDK) لنظام التشغيل Android لفتح الكاميرا في وضع المشاركة:

اختبار الكاميرات المشترَكة

اطّلِع على هذه الاختبارات الخاصة بالكاميرات التي يمكن استخدامها من قِبل عدة عملاء:

القيود

لا يتيح وضع الكاميرا المشتركة الخيارات التالية:

  • طلبات التقاط اللقطات المتسلسلة
  • جلسات الإضافات
  • الجلسات السريعة
  • جلسات بلا إنترنت
  • OutputConfiguration مع مشاركة مساحة العرض
  • جلسات الالتقاط التي يمكن إعادة معالجتها
  • التطبيقات التابعة لجهات خارجية

عندما يفتح تطبيق ذو أولوية أعلى الكاميرا في الوضع العادي، يطرد النظام جميع التطبيقات التي تشارك الكاميرا.