בדף הזה מפורטים ההבדלים בין מערכת התצוגה המורחבת (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, כדי לשנות פרמטרים, קוראים ל-API 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: במצלמות לוגיות, כמו מצלמת תצוגה היקפית, מנהל מערכת EVS פתח את כל המצלמות הפיזיות המשויכות, הפעיל את שידורי הווידאו וסיפק מערך מגובש של תמונות.
Camera2: כשנדרשת פונקציונליות דומה עם Camera2, האפליקציות צריכות לנהל מצלמות לוגיות, ולכן צריך:
- זיהוי מצלמות משנה פיזיות שמשויכות למצלמה לוגית.
- פותחים כל מצלמה פיזית שצריך.
- מפעילים סטרימינג בכל מצלמה.
- מסנכרנים את המסגרות, אם צריך. באופן אופטימלי, הטיפול הזה מתבצע ב-HAL לסנכרון ברמת החומרה.
כדי להקל על המעבר, נספק ללקוחות EVS קיימים ספריית תאימות (שכבת shim). המטרה היא לתמוך ב-Camera2 API עם שינויים מינימליים בקוד.
הרשאות
בקטע הזה מוסבר על שינויים בהרשאות.
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
, וזה חשוב לשירותים כמו מצלמות אחוריות שצריכות לפעול גם כשמחליפים משתמשים. נדרשת הרשאת גישה למצלמה שניתנה מראש.
android.permission.CAMERA_PRIVACY_ALLOWLIST
: מאפשר ליצרני ציוד מקורי (OEM) להחריג אפליקציות מסוימות שקריטיות לבטיחות מהמתג להגדרת הפרטיות של המצלמה שנשלט על ידי המשתמש.
אפליקציות מצלמה שקריטיות לבטיחות חייבות לפעול בהתאם למדיניות המובנית של Google בנושא הענקת הרשאות מראש, שמפורטת במאמר עיצוב לנהיגה.
לקוחות ראשיים ומשניים
כדי לשתף את הגישה למצלמה:
ב-EVS הוצעו ממשקי API מפורשים,
setPrimaryClient
ו-forcePrimaryClient
, לניהול הלקוח הראשי, שהייתה לו הסמכות לשנות פרמטרים.Camera2, כשהמצלמה נפתחת במצב שיתוף (Android 16 ומעלה), העדיפות של הלקוח שניגש למצלמה קובעת את הלקוח הראשי. הלקוח עם העדיפות הכי גבוהה (בדרך כלל האפליקציה שפועלת בחזית) יכול לשנות את הפרמטרים של בקשת הצילום. לא נעשה שימוש בממשקי API ישירים כדי לכפות סטטוס ראשי. הסטטוס הראשי מנוהל על ידי המסגרת.
מצלמות מערכת
כדי להגביל את הגישה למכשיר מצלמה לאפליקציות מערכת או לאפליקציות צד ראשון בלבד, צריך להצהיר על היכולת ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA
ב-Camera HAL עבור אותו מכשיר. בנוסף ל-android.permission.CAMERA
, לקוחות צריכים להיות מחוברים למכשיר המצלמה הזה עם android.permission.SYSTEM_CAMERA
.
מצלמה אחורית
EVS
בעבר, מערכת ה-EVS הפעילה גישה למצלמה לפני אתחול Android, אירוע קריטי לתכונות כמו מצלמות אחוריות. יצרני רכב מקוריים (OEM) אחראים לעמידה בתקנות ולמתן אישורים בהתאם לתקן הבטיחות הפדרלי לרכב ממונע (FMVSS), מספר 111, בנושא שדה ראייה אחורי. בנוסף, יצרני רכב חייבים לפעול בהתאם לתקנות אחרות שקשורות למצלמות אחוריות.
התאימות תלויה בחומרה, בהטמעה של HAL ובשילוב הכולל של המערכת. אחרי אתחול של Android בפלטפורמת ההפניה, בדרך כלל נדרשות 4 עד 6 שניות כדי שמערכת ה-EVS תפעל ותעניק גישה למצלמה.
Camera2
לקוח עם הרשאות, שמזוהה על ידי AID_AUTOMOTIVE_EVS UID
, יכול להשתמש בממשקי Camera2 API לגישה למצלמה לפני השלמת תהליך האתחול של Android. הגישה המוקדמת הזו מוגבלת למצלמות המערכת בחלק החיצוני של הרכב. Camera2 עומדת באותם מדדי ביצועים מרכזיים (KPI) לגישה מוקדמת למצלמה כמו EVS, שבדרך כלל הופכת לזמינה תוך ארבע עד שש שניות אחרי הפעלת Android.
כדי להציג את המצלמה האחורית באופן עקבי וללא הפרעות, במיוחד במהלך מעברים בין משתמשים או כשיישומים אחרים עלולים להסתיר את התצוגה המקדימה, מומלץ לפעול לפי ההנחיות הבאות כשמטמיעים את המצלמה האחורית באמצעות Camera2:
כדי להגביל את הגישה של אפליקציות צד שלישי, צריך להגדיר את המצלמה האחורית כמצלמת מערכת.
מריצים את השירות או האפליקציה שניגשים למצלמה כ
User 0
באמצעות ההרשאה CAMERA_HEADLESS_SYSTEM_USER. כך מובטח סטרימינג רציף מהמצלמה, ללא קשר למעבר בין משתמשים בחזית.מוסיפים את האפליקציה לרשימת האפליקציות המורשות לגישה למצלמה כדי להעניק גישה למצלמה גם כשהמתג של הפרטיות של המצלמה בשליטת המשתמש מופעל.
CarEVSManager ו-CarEVSService
בעבר, CarEVSManager סיפק לאפליקציות Java גישה למצלמה. המעבר ל-Camera2 מחליף את התכונה הזו ב-standard android.hardware.camera2.CameraManager
.
אנחנו מתכננים להוציא משימוש את CarEVSService
, שירות אופציונלי שעוקב אחרי הנכס GEAR_SELECTION VHAL
ומשמש להפעלת פעילות של מצלמה אחורית שצוינה על ידי יצרן ציוד מקורי (OEM). יצרני ציוד מקורי שמשתמשים בתכונה הזו צריכים להעביר את הלוגיקה המשויכת לאפליקציה בבעלות יצרן הציוד המקורי.
- מעקב אחרי המאפיין
GEAR_SELECTION VHAL
. - הפעלת הפעילות של המצלמה האחורית כשמפעילים את הילוך הרוורס.
- משתמשים ב-Camera2 APIs כדי להציג את פיד המצלמה.
רינדור של תצוגה
תצוגת EVS ושירות תצוגה לרכב
הם הוצאו משימוש.
Camera2
משתמשים בשיטות הרינדור הרגילות של Android עם Surface, android.hardware.display.DisplayManager
ו-android.view.Display
.
בתרחישים שבהם נדרשת הצגה מוקדמת של המצלמה, ImageReader של Camera2 יכול לספק גישה ישירה למאגר החומרה, כך שתוכלו לשלב אותו עם הטמעות קיימות של תצוגה מבוססת DRM לצורך עיבוד.
הגישה המוקדמת למצלמה מותרת באופן בלעדי ללקוחות עם הרשאות מיוחדות
שיש להם את AID_AUTOMOTIVE_EVS_UID
, והיא מוגבלת למצלמות מערכת שממוקמות
בחלק החיצוני של הרכב.
Emulator HAL (EVS mock HAL)
אנחנו מתכננים להוציא משימוש את EVS Mock HAL. במקום זאת, יצרני ציוד מקורי צריכים להשתמש ב-HAL של מצלמה מדומה Camera2, hardware/google/camera/devices/EmulatedCamera/
, שבו אנחנו מתכננים לתמוך ב:
- מספר המצלמות שניתן להגדרה.
- דפוסי בדיקה של סרגל הצבעים.
- אמולציה של קובץ וידאו.
כדי לכלול את ה-HAL הזה ב-build:
# In device.mk
PRODUCT_SOONG_NAMESPACES += hardware/google/camera/devices/EmulatedCamera
PRODUCT_PACKAGES += com.google.emulated.camera.provider.hal
נדרשות גם מדיניות מתאימה של Linux עם אבטחה משופרת (SELinux) כדי לאפשר ל-cameraserver
אינטראקציה עם שירות ה-HAL של המצלמה המדומה.
V4L2 UVC Camera HAL
אנחנו מתכננים להוציא משימוש את EVS V4L2 HAL. שימוש בתמיכה במצלמה חיצונית Camera2 עבור מצלמות USB (UVC). מידע נוסף זמין במאמר בנושא מצלמות USB חיצוניות.
Ultrasonics APIs
אנחנו מתכננים להוציא משימוש את ממשקי ה-API של 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>}
במילימטרים, המרחק שנמדד על ידי החיישן ושגיאת המרחק. אם נתמך רק טווח, זהו המרחק המינימלי בטווח שזוהה. |