בדף הזה מפורטים ההבדלים בין מערכת התצוגה המורחבת (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 לסנכרון ברמת החומרה.
כדי להקל על המעבר, נספק ספריית תאימות (שכבת shim) ללקוחות EVS קיימים. המטרה היא לתמוך ב-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.SYSTEM_CAMERA
בנוסף להרשאה android.permission.CAMERA
כדי להתחבר למצלמה הזו.
CarEVSManager ו-CarEVSService
לגישת API, אפליקציות Java צריכות להשתמש ב-android.hardware.camera2.CameraManager
הרגיל במקום ב-CarEVSManager
.
לגבי מצלמה אחורית, הלוגיקה ב-CarEVSService
שעוקבת אחרי המאפיין GEAR_SELECTION
VHAL ומפעילה פעילות חייבת להיות מועברת לאפליקציה בבעלות יצרן ציוד מקורי. האפליקציה הזו:
- עוקבת אחרי המאפיין
GEAR_SELECTION
VHAL. - מפעיל את המצלמה האחורית כשמעבירים להילוך אחורי.
- משתמש ב-Camera2 APIs כדי להציג את פיד המצלמה.
כדי להציג את המצלמה האחורית בצורה עקבית וברורה, במיוחד במהלך מעברים בין משתמשים או כשיישומים אחרים עלולים להסתיר את התצוגה המקדימה, מומלץ לפעול לפי ההנחיות הבאות כשמטמיעים את הפונקציונליות של המצלמה האחורית באמצעות 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
, והיא מוגבלת למצלמות מערכת שממוקמות
בחלק החיצוני של הרכב.
Emulator HAL (EVS mock HAL)
אנחנו מתכננים להוציא משימוש את EVS Mock HAL. במקום זאת, יצרני ציוד מקורי צריכים להשתמש ב-Camera2, רכיב HAL של מצלמה מדומה, 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 של המצלמה המדומה.
שכבת הפשטת חומרה (HAL) של מצלמת V4L2 UVC
אנחנו מתכננים להוציא משימוש את EVS V4L2 HAL. שימוש בתמיכה במצלמות חיצוניות של Camera2 עבור מצלמות USB (UVC). מידע נוסף זמין במאמר בנושא מצלמות USB חיצוניות.
גישה מוקדמת למצלמה
הגישה למצלמה של מערכת התצוגה החיצונית (EVS) הוגבלה ללקוחות עם הרשאות מיוחדות עם מזהה המשתמש AID_AUTOMOTIVE_EVS
. לגישה למצלמה לפני שתהליך האתחול של Android מסתיים, בתנאי שמזהה המשתמש נשאר AID_AUTOMOTIVE_EVS
. עם זאת, הגישה המוקדמת למצלמה מוגבלת למצלמות מערכת שממוקמות בחלק החיצוני של הרכב.
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>}
במילימטרים, המרחק שנמדד על ידי החיישן ושגיאת המרחק. אם נתמך רק טווח, זהו המרחק המינימלי בטווח שזוהה. |