نقل البيانات إلى Camera2

تحدّد هذه الصفحة الاختلافات بين نظام العرض الموسّع (EVS) وCamera2. وتوضّح أيضًا كيفية إعداد عملية تنفيذ Camera2.

فتح الكاميرا وإغلاقها

نظام العرض الموسّع (EVS)

openCamera تجمع بين فتح الجهاز وإعداد بث واحد.

Camera2

لفتح جهاز وإغلاقه باستخدام Camera2:

  1. اختَر أحد الأوضاع التالية:

  2. لإعداد البث، أنشِئ جلسة التقاط باستخدام أسطح الإخراج ذات الصلة. على سبيل المثال، من ImageReader أو SurfaceView باستخدام CameraDevice.createCaptureSession() (Java) أو ACameraDevice_createCaptureSession() (NDK).

    تتيح Camera2 بث عدة أحداث في الوقت نفسه. يمكنك إنشاء عدة أحداث لأغراض مثل المعاينة والتسجيل ومعالجة الصور. تعمل الأحداث كخطوط أنابيب موازية، وتُعالِج بالتسلسل الإطارات الأولية من الكاميرا.

  3. لإغلاق جهاز الكاميرا، استخدِم CameraDevice.close() (Java) أو ACameraDevice_close() (NDK).

إليك مقتطفات من نماذج الرموز البرمجية:

Java

CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
    manager.openCamera(cameraId, new CameraDevice.StateCallback() {
        @Override
        public void onOpened(@NonNull CameraDevice camera) {
            // Camera opened, now create session
        }
        @Override
        public void onDisconnected(@NonNull CameraDevice camera) {}
        @Override
        public void onError(@NonNull CameraDevice camera, int error) {}
    }, handler);
} catch (CameraAccessException e) {
    // Handle exception
}

NDK

ACameraManager *cameraManager = ACameraManager_create();
ACameraDevice *cameraDevice = nullptr;
camera_status_t status = ACameraManager_openCamera(
    cameraManager, cameraId, &deviceStateCallbacks, &cameraDevice);

بث بيانات الكاميرا

يوضّح هذا القسم كيفية بث بيانات الكاميرا.

نظام العرض الموسّع (EVS)

في نظام العرض الموسّع (EVS)، يمكنك:

  1. بدء البث باستخدام startVideoStream
  2. إيقاف البث باستخدام stopVideoStream

Camera2

في Camera2، يمكنك:

  1. إنشاء CaptureRequest مناسب للمعاينة باستخدام TEMPLATE_PREVIEW مع CameraDevice.createCaptureRequest() في Java أو ACameraDevice_createCaptureRequest() في NDK

  2. إرسال طلب البث المستمر باستخدام CameraCaptureSession.setSingleRepeatingRequest (Java) أو ACameraCaptureSession_setRepeatingRequestV2 (NDK)

  3. إيقاف البث باستخدام CameraCaptureSession.stopRepeating (Java) أو ACameraCaptureSession_stopRepeating (NDK).

إدارة المخزن المؤقت

  • في نظام العرض الموسّع (EVS)، setMaxFramesInFlight كانت تتحكّم سابقًا في عدد المخزن المؤقت، الذي يمكن تغييره أثناء البث. عند بدء بث الكاميرا، كان نظام العرض الموسّع (EVS) يوفّر رقم تعريف المخزن المؤقت لكل إطار صورة، والذي كان مرتبطًا بعنوان المخزن المؤقت نفسه في الذاكرة.

  • في Camera2، يتم ضبط الحد الأقصى لعدد الصور في AImageReader أو ImageReader باستخدام AImageReader_new أو ImageReader.newInstance عند تهيئة الجلسة. ولا يمكن تغيير هذا العدد بشكل ديناميكي بعد بدء الجلسة. للحصول على رقم تعريف المخزن المؤقت لكل إطار، يمكن للعملاء الاحتفاظ بخريطة تربط عنوان المخزن المؤقت للأجهزة، الذي يتم الحصول عليه من عنصر Image، بمعرّف فريد.

إيقاف البث مؤقتًا واستئنافه

  • استخدم نظام العرض الموسّع (EVS) الدالتَين pauseVideoStream وresumeVideoStream.

  • لا تتوفّر دالتان مكافئتان لهما في Camera2. بدلاً من ذلك، يمكنك استخدام:

مَعلمات الكاميرا

  • استخدم نظام العرض الموسّع (EVS) طرقًا، مثل setIntParameter لتغيير مَعلمة طلب التقاط الكاميرا.

  • في Camera2، لتعديل المَعلمات، استخدِم واجهة برمجة التطبيقات set لـ CaptureRequest builder ثم أرسِلها.

إليك نماذج من الرموز البرمجية:

Java

CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
builder.set(CaptureRequest.CONTROL_EFFECT_MODE, CaptureRequest.CONTROL_EFFECT_MODE_MONO);
// Submit this request

NDK

ACaptureRequest_setEntry_i32(captureRequest, ACAMERA_CONTROL_EFFECT_MODE, 1, &effectMode);

الكاميرات المنطقية

  • نظام العرض الموسّع (EVS): بالنسبة إلى الكاميرات المنطقية، مثل "عرض محيطي"، كان "مدير نظام العرض الموسّع" يفتح جميع الكاميرات الفعلية المرتبطة ويبدأ بث الفيديو ويوفر مجموعة متماسكة من الصور.

  • Camera2: عندما تكون هناك حاجة إلى وظائف مماثلة باستخدام Camera2، يجب أن تدير التطبيقات الكاميرات المنطقية، ما يتطلب منك ما يلي:

    • تحديد الكاميرات الفرعية الفعلية المرتبطة بكاميرا منطقية
    • فتح كل كاميرا فعلية ضرورية
    • بدء البث على كل كاميرا
    • مزامنة الإطارات، إذا لزم الأمر في أفضل الأحوال، يتم التعامل مع ذلك في طبقة تجريد الأجهزة (HAL) للمزامنة على مستوى الأجهزة.

سنوفّر مكتبة توافق (طبقة shim) لعملاء نظام العرض الموسّع (EVS) الحاليين لتسهيل عملية النقل. والهدف هو دعم واجهات برمجة تطبيقات Camera2 مع إجراء الحد الأدنى من التغييرات على الرمز البرمجي.

الأذونات

يوضّح هذا القسم التغييرات التي تم إجراؤها على الأذونات.

نظام العرض الموسّع (EVS)

يقتصر الوصول على المعرّفات الفريدة المميّزة (UID). على سبيل المثال، AID_AUTOMOTIVE_EVS. تشمل الأذونات المتوقّفة نهائيًا android.car.permission.USE_CAR_EVS_CAMERA.

Camera2

تتطلب Camera2 android.permission.CAMERA. بالنسبة إلى الحالات الخاصة:

  • android.permission.SYSTEM_CAMERA: للوصول إلى الكاميرات المخفية عن تطبيقات الجهات الخارجية يتطلب أيضًا إذن CAMERA. لمزيد من المعلومات، يُرجى الاطّلاع على الكاميرات على مستوى النظام.

  • android.permission.CAMERA_HEADLESS_SYSTEM_USER: يسمح بالوصول من User 0، وهو أمر بالغ الأهمية لخدمات مثل كاميرات الرؤية الخلفية التي يجب تشغيلها عند تبديل المستخدمين. يتطلب إذن CAMERA ممنوحًا مسبقًا.

  • android.permission.CAMERA_PRIVACY_ALLOWLIST: يسمح لمصنّعي المعدات الأصلية باستثناء تطبيقات معيّنة بالغة الأهمية للسلامة من مفتاح خصوصية الكاميرا الذي يتحكّم فيه المستخدم.

يجب أن تلتزم تطبيقات الكاميرا البالغة الأهمية للسلامة بسياسات المنح المسبق المضمّنة من Google الموضّحة في مقالة التصميم من أجل القيادة.

العملاء الأساسيون والثانويون

للوصول المشترَك إلى الكاميرا:

  • قدّم نظام العرض الموسّع (EVS) واجهات برمجة تطبيقات صريحة، setPrimaryClient و forcePrimaryClient، لإدارة العميل الأساسي الذي كان لديه الـ إذن بتعديل المَعلمات.

  • في Camera2، عند فتح الكاميرا في الوضع المشترَك (الإصدار 16 من Android والإصدارات الأحدث)، تحدّد أولوية العميل الذي يصل إلى الكاميرا العميل الأساسي. يمكن للعميل ذي الأولوية القصوى (عادةً التطبيق الذي يعمل في المقدّمة) تعديل مَعلمات طلب الالتقاط. لا يتم استخدام أي واجهات برمجة تطبيقات مباشرة لفرض الحالة الأساسية. تتم إدارة الحالة الأساسية من خلال الإطار.

الكاميرات على مستوى النظام

لتقييد الوصول إلى جهاز الكاميرا على تطبيقات النظام أو تطبيقات الطرف الأول فقط، عليك الإعلان عن إمكانية ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA في طبقة تجريد الأجهزة (HAL) للكاميرا لهذا الجهاز. يجب أن يحصل العملاء على إذن android.permission.SYSTEM_CAMERA، بالإضافة إلى إذن android.permission.CAMERA المرتبط بجهاز الكاميرا هذا.

كاميرا الرؤية الخلفية

نظام العرض الموسّع (EVS)

كان نظام العرض الموسّع (EVS) يتيح سابقًا الوصول إلى الكاميرا قبل بدء تشغيل Android، وهو حدث بالغ الأهمية لميزات مثل كاميرات الرؤية الخلفية. يتحمّل مصنّعو المعدات الأصلية للمركبات مسؤولية الامتثال والشهادات بموجب اللوائح التنظيمية المنصوص عليها في المعيار الفيدرالي لسلامة المركبات الآلية (FMVSS)، رقم 111، الرؤية الخلفية. بالإضافة إلى ذلك، يجب أن يلتزم مصنّعو المعدات الأصلية للمركبات باللوائح التنظيمية الأخرى لكاميرات الرؤية الخلفية.

يعتمد الامتثال على الأجهزة وتنفيذ طبقة تجريد الأجهزة (HAL) وعملية التكامل الشاملة للنظام. بعد بدء تشغيل Android على النظام الأساسي المرجعي، يحتاج نظام العرض الموسّع (EVS) عادةً إلى أربع إلى ست ثوانٍ ليصبح جاهزًا للتشغيل ومنح إذن الوصول إلى الكاميرا.

Camera2

يمكن لعميل مميّز، يتم تحديده من خلال AID_AUTOMOTIVE_EVS UID، استخدام واجهات برمجة تطبيقات Camera2 للوصول إلى الكاميرا قبل اكتمال عملية بدء تشغيل Android. يقتصر هذا الوصول المبكر على الكاميرات على مستوى النظام الموجودة على الجزء الخارجي من المركبة. تستوفي Camera2 مؤشرات الأداء الرئيسية نفسها للوصول المبكر إلى الكاميرا مثل نظام العرض الموسّع (EVS)، الذي يصبح متاحًا عادةً في غضون أربع إلى ست ثوانٍ بعد بدء تشغيل Android.

للحصول على عرض متّسق وغير محجوب لكاميرا الرؤية الخلفية، خاصةً أثناء عمليات نقل المستخدم أو عندما قد تحجب تطبيقات أخرى المعاينة، ننصحك باتّباع هذه الإرشادات عند تنفيذ كاميرا الرؤية الخلفية باستخدام Camera2:

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

  2. يمكنك تشغيل الخدمة أو التطبيق الذي يصل إلى الكاميرا باسم User 0 باستخدام إذن CAMERA_HEADLESS_SYSTEM_USER. يضمن ذلك بث الكاميرا بدون انقطاع، بغض النظر عن تبديل المستخدم الذي يظهر في المقدّمة.

  3. يمكنك إضافة التطبيق إلى قائمة السماح بخصوصية الكاميرا لمنح إذن الوصول إلى الكاميرا حتى عندما يكون مفتاح خصوصية الكاميرا الذي يتحكّم فيه المستخدم مفعّلاً.

CarEVSManager وCarEVSService

كان CarEVSManager يمنح سابقًا تطبيقات Java إذن الوصول إلى الكاميرا. يؤدي النقل إلى Camera2 إلى استبدال هذه الميزة بـ standard android.hardware.camera2.CameraManager.

نخطّط لإيقاف CarEVSService نهائيًا، وهي خدمة اختيارية تراقب السمة GEAR_SELECTION VHAL وكانت تُستخدم لبدء نشاط كاميرا الرؤية الخلفية الذي يحدّده مصنّع المعدات الأصلية. على مصنّعي المعدات الأصلية الذين يستخدمون هذه الميزة نقل المنطق المرتبط بها إلى تطبيق مملوك لهم.

  • مراقبة السمة GEAR_SELECTION VHAL
  • بدء نشاط كاميرا الرؤية الخلفية عند تفعيل الترس الخلفي
  • استخدام واجهات برمجة تطبيقات Camera2 لعرض لقطات الكاميرا

عرض شاشة العرض

شاشة العرض في نظام العرض الموسّع (EVS) وخدمة شاشة العرض في السيارات

تم إيقاف هاتَين الميزتَين نهائيًا.

Camera2

يمكنك استخدام طرق العرض العادية في Android مع Surface، android.hardware.display.DisplayManager، و android.view.Display.

بالنسبة إلى السيناريوهات التي تتطلب عرض الكاميرا مبكرًا، يمكن أن يوفّر Camera2 ImageReader وصولاً مباشرًا إلى المخزن المؤقت للأجهزة حتى تتمكّن من دمجه مع عمليات تنفيذ شاشة العرض الحالية المستندة إلى إدارة الحقوق الرقمية (DRM) للعرض.

يُسمح بالوصول المبكر إلى الكاميرا حصريًا للعملاء المميّزين الذين لديهم AID_AUTOMOTIVE_EVS_UID ويقتصر على الكاميرات على مستوى النظام الموجودة على الجزء الخارجي من المركبة.

طبقة تجريد الأجهزة (HAL) للمحاكي (طبقة تجريد الأجهزة (HAL) الوهمية لنظام العرض الموسّع (EVS))

نخطّط لإيقاف طبقة تجريد الأجهزة (HAL) الوهمية لنظام العرض الموسّع (EVS) نهائيًا. بدلاً من ذلك، على مصنّعي المعدات الأصلية استخدام طبقة تجريد الأجهزة (HAL) للكاميرا المحاكاة في Camera2 ، hardware/google/camera/devices/EmulatedCamera/والتي نخطّط لدعم ما يلي فيها:

  • عدد الكاميرات القابل للإعداد
  • أنماط اختبار الأشرطة الملوّنة
  • محاكاة ملفات الفيديو

لتضمين طبقة تجريد الأجهزة (HAL) هذه في الإصدار:

# In device.mk
PRODUCT_SOONG_NAMESPACES += hardware/google/camera/devices/EmulatedCamera
PRODUCT_PACKAGES += com.google.emulated.camera.provider.hal

مطلوب أيضًا سياسات Linux المحسّنة للأمان (SELinux) المناسبة للسماح لـ cameraserver بالتفاعل مع خدمة طبقة تجريد الأجهزة (HAL) للكاميرا المحاكاة.

طبقة تجريد الأجهزة (HAL) لكاميرا V4L2 UVC

نخطّط لإيقاف طبقة تجريد الأجهزة (HAL) لـ V4L2 في نظام العرض الموسّع (EVS) نهائيًا. يمكنك استخدام دعم الكاميرا الخارجية في Camera2 لكاميرات USB (UVC). لمزيد من المعلومات، يُرجى الاطّلاع على الكاميرات الخارجية المتصلة عبر USB.

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

نخطّط لإيقاف واجهات برمجة تطبيقات الموجات فوق الصوتية في نظام العرض الموسّع (EVS) نهائيًا. بدلاً من ذلك، يمكنك استخدام سمات VHAL التالية التي تم طرحها في Android 15 لرصد أجهزة الاستشعار فوق الصوتية.

السمة النوع التعريف
ULTRASONICS_SENSOR_POSITION ثابت {<x>, <y>, <z>}

بالملليمترات، تمثّل كل قيمة موضع جهاز الاستشعار على طول المحور المرتبط بالنسبة إلى إطار إحداثيات جهاز استشعار AAOS.

ULTRASONICS_SENSOR_ORIENTATION ثابت {<qw>, <qx>, <qy>, <qz>}

وهو دوران جهاز الاستشعار هذا حول الرباعي بالنسبة إلى إطار إحداثيات جهاز استشعار AAOS: $$w+xi+yj+zk$$

ULTRASONICS_SENSOR_FIELD_OF_VIEW ثابت {<horizontal>, <vertical>}

بالدرجات، مجال رؤية جهاز الاستشعار الأفقي والعمودي

ULTRASONICS_SENSOR_DETECTION_RANGE ثابت {<minimum>, <maximum>}

بالملليمترات، نطاق رصد جهاز الاستشعار

ULTRASONICS_SENSOR_DETECTION_RANGES ثابت {<range_min_1>, <range_max_1>, <range_min_2>, <range_max_2>}

بالملليمترات، شاملة، هي مجموعة من نطاقات رصد جهاز الاستشعار المتوافقة.

ULTRASONICS_SENSOR_DETECTION_RANGES غير متقطع {<distance>, <distance_error>}

بالملليمترات، هي المسافة التي تم قياسها لجهاز الاستشعار والخطأ في المسافة. إذا كان النطاق فقط هو المتوافق، فهذه هي الحد الأدنى للمسافة في النطاق الذي تم رصده.