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

‫CarEVSManager ו-CarEVSService

לגישת API, אפליקציות Java צריכות להשתמש ב-android.hardware.camera2.CameraManager הרגיל במקום ב-CarEVSManager.

לגבי מצלמה אחורית, הלוגיקה ב-CarEVSService שעוקבת אחרי המאפיין GEAR_SELECTION VHAL ומפעילה פעילות חייבת להיות מועברת לאפליקציה בבעלות יצרן ציוד מקורי. האפליקציה הזו:

  • עוקבת אחרי המאפיין GEAR_SELECTION VHAL.
  • מפעיל את המצלמה האחורית כשמעבירים להילוך אחורי.
  • משתמש ב-Camera2 APIs כדי להציג את פיד המצלמה.

כדי להציג את המצלמה האחורית בצורה עקבית וברורה, במיוחד במהלך מעברים בין משתמשים או כשיישומים אחרים עלולים להסתיר את התצוגה המקדימה, מומלץ לפעול לפי ההנחיות הבאות כשמטמיעים את הפונקציונליות של המצלמה האחורית באמצעות Camera2:

רינדור של תצוגה

שירות תצוגה של 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>}

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