מעבר ל-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, כדי לשנות פרמטרים, קוראים ל-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:

  1. כדי להגביל את הגישה של אפליקציות צד שלישי, צריך להגדיר את המצלמה האחורית כמצלמת מערכת.

  2. מריצים את השירות או האפליקציה שניגשים למצלמה כUser 0 באמצעות ההרשאה CAMERA_HEADLESS_SYSTEM_USER. כך מובטח סטרימינג רציף מהמצלמה, ללא קשר למעבר בין משתמשים בחזית.

  3. מוסיפים את האפליקציה לרשימת האפליקציות המורשות לגישה למצלמה כדי להעניק גישה למצלמה גם כשהמתג של הפרטיות של המצלמה בשליטת המשתמש מופעל.

‫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>}

במילימטרים, המרחק שנמדד על ידי החיישן ושגיאת המרחק. אם נתמך רק טווח, זהו המרחק המינימלי בטווח שזוהה.