אפשר לאפשר לכמה לקוחות לגשת למצלמה בו-זמנית. כדי לעשות זאת, משתמשים בממשקי המערכת של Java ו-Android NDK שמתוארים בדף הזה כדי לשתף גישה ללקוחות של מצלמת המערכת.
לקוח ראשי: הלקוח בעדיפות הכי גבוהה מבין הלקוחות המשותפים. לקוח ראשי יכול ליצור בקשות ללכידת נתונים ולשנות את פרמטרים של לכידת הנתונים.
לקוח משני: כל הלקוחות המשותפים האחרים הם לקוחות משניים. לקוחות משניים לא יכולים ליצור בקשות ללכידת נתונים ולא יכולים לשנות פרמטרים של לכידת נתונים. לקוחות משניים יכולים לשלוח רק בקשות להתחלת סטרימינג או להפסקת סטרימינג.
לשידור, שירות המצלמה משתמש בפרמטרים של בקשת הצילום שמוגדרים כברירת מחדל עבור תבנית התצוגה המקדימה. אם הלקוח הראשי מבצע סטרימינג, השירות משתמש בפרמטרים של בקשת הצילום שצוינו על ידי הלקוח הראשי.
הגדרת סשן משותף
כדי לשתף מצלמה, צריך לספק את הגדרות הסשן המשותף בקובץ shared_session_config.xml שנמצא בתיקייה /system_ext/etc/. בדוגמת הקוד הזו, מזהה המצלמה 0 תומך בשיתוף המצלמה עם הגדרה שכוללת שני סטרימינגים, ImageReader ו-SurfaceView.
<SharedCameraSessionConfigurations colorSpace="-1">
<!-- colorSpace: ANDROID_REQUEST_AVAILABLE_COLOR_SPACE_PROFILES_MAP_UNSPECIFIED -->
<SharedCameraSessionConfiguration cameraId="0">
<!-- First OutputConfiguration: All optional fields are provided -->
<OutputConfiguration>
<!-- surfaceType: SURFACE_TYPE_IMAGE_READER -->
<surfaceType>4</surfaceType>
<width>1920</width>
<height>1080</height>
<!-- physicalCameraId is omitted; defaults to "" -->
<!-- streamUseCase: ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT -->
<streamUseCase>0</streamUseCase>
<!-- timestampBase: TIMESTAMP_BASE_DEFAULT -->
<timestampBase>0</timestampBase>
<!-- mirrorMode: MIRROR_MODE_AUTO -->
<mirrorMode>0</mirrorMode>
<useReadoutTimestamp>0</useReadoutTimestamp>
<!-- format: HAL_PIXEL_FORMAT_RGBA_8888 -->
<format>1</format>
<!-- usage: AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN -->
<usage>3</usage>
<!-- dataSpace: HAL_DATASPACE_UNKNOWN -->
<dataSpace>0</dataSpace>
</OutputConfiguration>
<!-- Second OutputConfiguration: All optional fields are provided -->
<OutputConfiguration>
<!-- surfaceType: SURFACE_TYPE_SURFACE_VIEW -->
<surfaceType>0</surfaceType>
<width>1920</width>
<height>1080</height>
<!-- physicalCameraId is omitted; defaults to "" -->
<!-- streamUseCase: ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT -->
<streamUseCase>0</streamUseCase>
<!-- timestampBase: TIMESTAMP_BASE_DEFAULT -->
<timestampBase>0</timestampBase>
<!-- mirrorMode: MIRROR_MODE_AUTO -->
<mirrorMode>0</mirrorMode>
<useReadoutTimestamp>0</useReadoutTimestamp>
<!-- format: HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED -->
<format>34</format>
<!-- usage: AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE|AHARDWAREBUFFER_USAGE_COMPOSER_OVERLAY -->
<usage>256|2048</usage>
<!-- dataSpace: HAL_DATASPACE_UNKNOWN -->
<dataSpace>0</dataSpace>
</OutputConfiguration>
</SharedCameraSessionConfiguration>
</SharedCameraSessionConfigurations>
כדי לשלוח שאילתה לגבי הגדרת סשן משותף, לקוחות משתמשים ב-CameraCharacteristics עבור SHARED_SESSION_CONFIGURATION. לקוחות שניגשים למצלמה במצב שיתוף צריכים להשתמש בהגדרת הסשן המשותף. אם הגדרת הסשן שמועברת על ידי הלקוח לא תואמת להגדרת הסשן המשותפת, הקריאה ל-createCaptureSession תיכשל.
Java APIs
CameraManager ו-CameraDevice מספקים ממשקי API לפתיחת מצלמות במצב שיתוף.
ממשקי CameraManager API
CameraManager מספק את ממשקי ה-API הבאים:
isCameraDeviceSharingSupported: לקוחות משתמשים ב-API הזה כדי לקבוע אם מצלמה תומכת במצב שיתוף.
openSharedCamera: אם המצלמה תומכת במצב שיתוף, הלקוחות משתמשים ב-API הזה כדי לפתוח את המצלמה במצב שיתוף.
ממשקי CameraDevice.StateCallback API
CameraDevice.StateCallback מספק את ממשקי ה-API הבאים:
onOpenedInSharedMode: הלקוחות מקבלים את הקריאה החוזרת הזו כשהמצלמה נפתחת במצב שיתוף. הקריאה החוזרת מציינת אם הלקוח הוא הלקוח הראשי או המשני.
onClientSharedAccessPriorityChanged: כשפותחים סשן משותף, הקריאה החוזרת הזו מופעלת כשמשנים את העדיפות של לקוח כי לקוח עם עדיפות גבוהה יותר פתח או סגר את אותה מצלמה.
CameraSharedCaptureSession
הכיתה CameraSharedCaptureSession מייצגת סשן צילום משותף.
במצב של מצלמה משותפת, לקוח שיוצר סשן חייב להשתמש בסוג הסשן SESSION_SHARED.
כשהמערכת יוצרת סשן, מפעילים Cast CameraCaptureSession אל CameraSharedCaptureSession.
לקוחות משניים לא יכולים להשתמש ב-createCaptureRequest. במקום זאת, לקוחות משניים משתמשים ב-API startStreaming כדי להתחיל סטרימינג במשטחים שצוינו, וב-API stopStreaming כדי להפסיק את הסטרימינג.
Android NDK APIs
אפליקציות מובנות משתמשות בממשקי ה-API האלה של Android NDK כדי לפתוח מצלמה במצב שיתוף:
ACameraManager_isCameraDeviceSharingSupportedACameraManager_openSharedCameraACameraCaptureSessionShared_startStreamingACameraCaptureSessionShared_logicalCamera_startStreamingACameraCaptureSessionShared_stopStreamingACameraDevice_ClientSharedAccessPriorityChangedCallbackonClientSharedAccessPriorityChanged
בדיקת מצלמות משותפות
אפשר לעיין בבדיקות האלה שספציפיות למצלמות מרובות לקוחות:
חבילת בדיקות של ספק (VTS): ראו
SharedCameraTestבVtsAidlCameraServiceTargetTestחבילה לבדיקות תאימות (CTS): ראו
android.hardware.multiprocess.camera.cts.SharedCameraTestבCtsCameraTestCases
הגבלות
במצב מצלמה משותפת אין תמיכה באפשרויות הבאות:
- בקשות צילום רצופות
- סשנים של תוספים
- סשנים במהירות גבוהה
- סשנים אופליין
OutputConfigurationעם שיתוף פלטפורמות- סשנים של צילום מסך שאפשר לעבד מחדש
- אפליקציות של צד שלישי
כשלקוח עם עדיפות גבוהה יותר פותח מצלמה במצב רגיל, המערכת מפנה את כל הלקוחות שמשתמשים במצלמה משותפת.