نقل البيانات إلى 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 أداة الإنشاء ثم أرسِلها.

ضع في اعتبارك نماذج الرموز البرمجية التالية:

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) للمزامنة على مستوى الأجهزة.

سنوفّر مكتبة توافق (طبقة محاكاة) لعملاء 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 في Camera HAL لهذا الجهاز. يجب أن تتضمّن الأجهزة العميلة android.permission.SYSTEM_CAMERA بالإضافة إلى android.permission.CAMERA للاتصال بجهاز الكاميرا هذا.

CarEVSManager وCarEVSService

للوصول إلى واجهة برمجة التطبيقات، يجب أن تستخدم تطبيقات Java android.hardware.camera2.CameraManager بدلاً من CarEVSManager.

بالنسبة إلى كاميرا الرؤية الخلفية، يجب نقل المنطق في CarEVSService الذي يراقب السمة GEAR_SELECTION VHAL ويشغّل نشاطًا إلى تطبيق مملوك من الشركة المصنّعة الأصلية. ويجب أن يتوفّر في هذا التطبيق ما يلي:

  • تراقب هذه السياسة سمة GEAR_SELECTION في VHAL.
  • يتم تشغيل نشاط كاميرا الرجوع إلى الخلف عند استخدام ترس الرجوع.
  • يستخدم واجهات برمجة التطبيقات Camera2 لعرض خلاصة الكاميرا.

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

عرض الشاشة

خدمة عرض EVS وشاشات السيارات

تم إيقاف هذه السمة نهائيًا.

Camera2

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

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

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

طبقة تجريد الأجهزة (HAL) للمحاكي (طبقة تجريد الأجهزة (HAL) الوهمية لخدمة EVS)

نخطّط لإيقاف EVS Mock HAL نهائيًا. بدلاً من ذلك، على المصنّعين الأصليين للأجهزة استخدام طبقة تجريد الأجهزة (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

يجب أيضًا توفُّر سياسات SELinux المناسبة لكي يتمكّن cameraserver من التفاعل مع خدمة Emulated Camera HAL.

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

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

الوصول إلى الكاميرا قبل إطلاقها

كان الوصول إلى كاميرا EVS مقتصرًا على العملاء الذين لديهم امتيازات خاصة مع AID_AUTOMOTIVE_EVS UID. للوصول إلى الكاميرا قبل اكتمال عملية بدء تشغيل Android، يجب أن يظل معرّف UID هو AID_AUTOMOTIVE_EVS. ومع ذلك، يقتصر الوصول المبكر إلى الكاميرا على كاميرات النظام المثبَّتة على الجزء الخارجي من المركبة.

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

نخطّط لإيقاف واجهات برمجة التطبيقات EVS Ultrasonics نهائيًا. بدلاً من ذلك، استخدِم سمات 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>}

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