توضّح هذه الصفحة الاختلافات بين نظام العرض الموسّع (EVS) وCamera2. توضّح أيضًا كيفية إعداد تنفيذ Camera2.
فتح الكاميرا وإغلاقها
EVS
تجمع openCamera
بين فتح الجهاز وإعداد بث واحد.
Camera2
لفتح جهاز وإغلاقه باستخدام Camera2، اتّبِع الخطوات التالية:
اختَر أحد الأوضاع التالية:
وضع الوصول الحصري، استخدِم
CameraManager.openCamera
(Java) أوACameraManager_openCamera
في حزمة تطوير البرامج الأصلية (NDK).الوضع المشترك، استخدِم
openSharedCamera
أوACameraManager_openSharedCamera
. عند تفعيل ميزة مشاركة الكاميرا، يجب تقديم إعدادات جلسة مشتركة.
لضبط عمليات البث، أنشئ جلسة تسجيل باستخدام مساحات العرض ذات الصلة. على سبيل المثال، من ImageReader أو SurfaceView باستخدام
CameraDevice.createCaptureSession()
(Java) أوACameraDevice_createCaptureSession()
(NDK).تتيح واجهة برمجة التطبيقات Camera2 بث عدة أحداث في الوقت نفسه. إنشاء عدة عمليات بث لأغراض مثل المعاينة والتسجيل ومعالجة الصور تعمل عمليات البث كخطوط أنابيب متوازية، وتُعالج اللقطات الأولية من الكاميرا بالتسلسل.
لإغلاق جهاز كاميرا، استخدِم
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، يمكنك إجراء ما يلي:
- ابدأ البث باستخدام
startVideoStream
. - لإيقاف البث، استخدِم
stopVideoStream
.
Camera2
في Camera2، يمكنك إجراء ما يلي:
أنشئ
CaptureRequest
مناسبًا للمعاينة، واستخدِمTEMPLATE_PREVIEW
معCameraDevice.createCaptureRequest()
في Java أوACameraDevice_createCaptureRequest()
على NDK.أرسِل طلب البث المتواصل باستخدام
CameraCaptureSession.setSingleRepeatingRequest
(Java) أوACameraCaptureSession_setRepeatingRequestV2
(NDK).أوقِف البث واستخدِم
CameraCaptureSession.stopRepeating
(Java) أوACameraCaptureSession_stopRepeating
(NDK).
إدارة المخزن المؤقت
في EVS، كان
setMaxFramesInFlight
يتحكّم سابقًا في عدد المخزن المؤقت، الذي يمكن تغييره أثناء البث. عند بدء بث الكاميرا، قدّمت خدمة EVS رقم تعريف المخزن المؤقت لكل إطار صورة، والذي كان مرتبطًا بعنوان المخزن المؤقت للأجهزة نفسه في الذاكرة.في Camera2، يتم ضبط الحد الأقصى لعدد الصور في
AImageReader
أوImageReader
باستخدامAImageReader_new
أوImageReader.newInstance
عند بدء جلسة. ولا يمكن تغيير هذا الإعداد بشكل ديناميكي بعد بدء الجلسة. للحصول على معرّف مخزن مؤقت لكل إطار، يمكن للعملاء الاحتفاظ بخريطة تربط عنوان المخزن المؤقت للأجهزة، الذي تم الحصول عليه من العنصرImage
، بمعرّف فريد.
إيقاف البث مؤقتًا واستئنافه
استخدمت EVS
pauseVideoStream
وresumeVideoStream
.لا تتوفّر أي مكافئات مباشرة لـ Camera2. بدلاً من ذلك، يمكنك:
- إيقاف مؤقت، استخدِم
stopRepeating
- استئناف، استخدِم
setSingleRepeatingRequest
- إيقاف مؤقت، استخدِم
مَعلمات الكاميرا
استخدمت خدمة 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:
ضَع علامة على كاميرا الرجوع إلى الخلف باعتبارها كاميرا نظام.
شغِّل الخدمة أو التطبيق الذي يصل إلى الكاميرا بصفتك
User 0
باستخدام إذنCAMERA_HEADLESS_SYSTEM_USER
.أضِف التطبيق إلى قائمة التطبيقات المسموح لها بالوصول إلى الكاميرا.
عرض الشاشة
خدمة عرض 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>}
تمثّل هذه السمة المسافة التي قاسها المستشعر ومقدار الخطأ في المسافة، وذلك بالملليمتر. إذا كان النطاق فقط متاحًا، ستكون هذه هي الحد الأدنى للمسافة في النطاق الذي تم رصده. |