توضّح هذه الصفحة الاختلافات بين نظام العرض الموسّع (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
يقتصر الوصول على المعرّفات الفريدة ذات الامتيازات. على سبيل المثال،
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:
حدِّد كاميرا الرؤية الخلفية ككاميرا نظام لحظر وصول تطبيقات الجهات الخارجية إليها.
تشغيل الخدمة أو التطبيق الذي يصل إلى الكاميرا بصفتك
User 0
باستخدام إذن CAMERA_HEADLESS_SYSTEM_USER ويضمن ذلك بثًا متواصلاً من الكاميرا، بغض النظر عن تبديل المستخدمين في المقدّمة.أضِف التطبيق إلى قائمة السماح بخصوصية الكاميرا لمنح إذن الوصول إلى الكاميرا حتى عندما يكون مفتاح التحكّم في خصوصية الكاميرا الذي يتحكّم فيه المستخدم مفعَّلاً.
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>}
تمثّل هذه السمة المسافة التي قاسها المستشعر ومقدار الخطأ في المسافة، وذلك بالملليمتر. إذا كان النطاق فقط متاحًا، ستكون هذه هي الحد الأدنى للمسافة في النطاق الذي تم رصده. |