מעבר ל-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 לסנכרון ברמת החומרה.

כדי להקל על המעבר, נספק ספריית תאימות (שכבת 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.CAMERA, הלקוחות צריכים להיות מחוברים למכשיר המצלמה הזה באמצעות android.permission.SYSTEM_CAMERA.

מצלמה אחורית

EVS

בעבר, מערכת ה-EVS הפעילה גישה למצלמה לפני אתחול Android, אירוע קריטי לתכונות כמו מצלמות אחוריות. יצרני רכב מקוריים (OEM) אחראים לעמידה בתקנות ולמתן אישורים בהתאם לתקן הבטיחות הפדרלי לרכב ממונע (FMVSS), מספר 111, בנושא שדה ראייה אחורי. בנוסף, יצרני רכב חייבים לעמוד בתקנות אחרות שקשורות למצלמות אחוריות.

התאימות תלויה בחומרה, בהטמעה של HAL ובשילוב הכולל של המערכת. אחרי הפעלה של Android בפלטפורמת ההפניה, בדרך כלל נדרשות ארבע עד שש שניות כדי שמערכת ה-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 של המצלמה המדומה.

מצלמה עם HAL‏ V4L2 UVC

אנחנו מתכננים להוציא משימוש את EVS V4L2 HAL. שימוש בתמיכה במצלמה חיצונית של Camera2 עבור מצלמות USB ‏ (UVC). מידע נוסף זמין במאמר בנושא מצלמות USB חיצוניות.

Ultrasonics APIs

אנחנו מתכננים להוציא משימוש את ממשקי ה-API של EVS Ultrasonics. במקום זאת, אפשר להשתמש במאפייני VHAL האלה שהוצגו ב-Android 15 לזיהוי חיישנים על-קוליים.

מאפיין (property) סוג הגדרה
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 Continuous {<distance>, <distance_error>}

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