نقل البيانات إلى 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

يقتصر الوصول على المعرّفات الفريدة ذات الامتيازات. على سبيل المثال، 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، متصلَين بجهاز الكاميرا هذا.

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

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.

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

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

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

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

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