Bạn có thể cho phép nhiều ứng dụng cùng lúc truy cập vào một camera. Để làm như vậy, hãy sử dụng các API hệ thống Java và Android NDK được mô tả trên trang này để chia sẻ quyền truy cập vào các ứng dụng máy ảnh hệ thống.
Ứng dụng chính: Ứng dụng có mức độ ưu tiên cao nhất trong số các ứng dụng dùng chung. Ứng dụng khách chính có thể tạo yêu cầu chụp và sửa đổi các tham số chụp.
Khách hàng phụ: Tất cả khách hàng dùng chung khác đều là khách hàng phụ. Ứng dụng phụ không thể tạo yêu cầu ghi hình cũng như không thể sửa đổi các tham số ghi hình. Ứng dụng phụ chỉ có thể gửi yêu cầu bắt đầu hoặc dừng truyền phát trực tiếp.
Đối với hoạt động phát trực tuyến, dịch vụ camera sẽ sử dụng các thông số yêu cầu chụp mặc định cho mẫu xem trước. Nếu ứng dụng chính đang phát trực tuyến, thì dịch vụ sẽ sử dụng các tham số yêu cầu ghi hình do ứng dụng chính chỉ định.
Định cấu hình phiên được chia sẻ
Để chia sẻ một thiết bị camera, hãy cung cấp cấu hình phiên được chia sẻ trong tệp có tên shared_session_config.xml nằm trong /system_ext/etc/. Trong mẫu mã này, mã nhận dạng camera 0 hỗ trợ tính năng chia sẻ camera với một cấu hình bao gồm 2 luồng, ImageReader và 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>
Để truy vấn cấu hình phiên dùng chung, các ứng dụng sẽ dùng CameraCharacteristics cho SHARED_SESSION_CONFIGURATION. Những ứng dụng truy cập vào camera ở chế độ dùng chung phải sử dụng cấu hình phiên dùng chung. Khi cấu hình phiên do một ứng dụng truyền không khớp với cấu hình phiên được chia sẻ, lệnh gọi createCaptureSession sẽ không thành công.
API Java
CameraManager và CameraDevice cung cấp các API để mở camera ở chế độ dùng chung.
CameraManager API
CameraManager cung cấp các API sau:
isCameraDeviceSharingSupported: Các ứng dụng sử dụng API này để xác định xem camera có hỗ trợ chế độ chia sẻ hay không.openSharedCamera: Nếu một camera hỗ trợ chế độ dùng chung, thì các ứng dụng sẽ dùng API này để mở camera ở chế độ dùng chung.
CameraDevice.StateCallback API
CameraDevice.StateCallback cung cấp các API sau:
onOpenedInSharedMode: Các ứng dụng nhận được lệnh gọi lại này khi camera được mở ở chế độ dùng chung. Lệnh gọi lại cho biết liệu ứng dụng là ứng dụng chính hay ứng dụng phụ.onClientSharedAccessPriorityChanged: Khi một phiên dùng chung được mở, lệnh gọi lại này sẽ được kích hoạt khi mức độ ưu tiên của một ứng dụng thay đổi vì một ứng dụng có mức độ ưu tiên cao hơn đã mở hoặc đóng cùng một camera.
CameraSharedCaptureSession
Lớp CameraSharedCaptureSession biểu thị một phiên chụp dùng chung.
Ở chế độ camera dùng chung, ứng dụng tạo phiên phải sử dụng loại phiên SESSION_SHARED.
Khi hệ thống tạo một phiên, hãy truyền CameraCaptureSession đến CameraSharedCaptureSession.
Ứng dụng khách phụ không thể sử dụng createCaptureRequest. Thay vào đó, các ứng dụng khách phụ sẽ dùng API startStreaming để bắt đầu phát trực tuyến trên các nền tảng được chỉ định và API stopStreaming để dừng phát trực tuyến.
API Android NDK
Các ứng dụng tích hợp sẵn sử dụng những API Android NDK này để mở camera ở chế độ dùng chung:
ACameraManager_isCameraDeviceSharingSupportedACameraManager_openSharedCameraACameraCaptureSessionShared_startStreamingACameraCaptureSessionShared_logicalCamera_startStreamingACameraCaptureSessionShared_stopStreamingACameraDevice_ClientSharedAccessPriorityChangedCallbackonClientSharedAccessPriorityChanged
Kiểm thử camera dùng chung
Xem những kiểm thử dành riêng cho camera có nhiều ứng dụng khách:
Bộ kiểm thử của nhà cung cấp (VTS): Xem
SharedCameraTesttrongVtsAidlCameraServiceTargetTestBộ kiểm thử tính tương thích (CTS): Xem
android.hardware.multiprocess.camera.cts.SharedCameraTesttrongCtsCameraTestCases
Quy định hạn chế
Chế độ camera dùng chung không hỗ trợ các lựa chọn sau:
- Yêu cầu chụp liên tục
- Phiên mở rộng
- Phiên tốc độ cao
- Phiên ngoại tuyến
OutputConfigurationcó tính năng chia sẻ màn hình- Các phiên chụp có thể xử lý lại
- Ứng dụng của bên thứ ba
Khi một ứng dụng có mức độ ưu tiên cao hơn mở camera ở chế độ thông thường, hệ thống sẽ loại bỏ tất cả các ứng dụng camera dùng chung.