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

يمكنك السماح لعدة عملاء بالوصول إلى كاميرا في الوقت نفسه. لإجراء ذلك، استخدِم واجهات برمجة التطبيقات لنظام 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

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

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

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

القيود

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

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

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