Bạn có thể cho phép nhiều ứng dụng đồng thời truy cập vào một máy ảnh. Để 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 của 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 được chia sẻ. Ứng dụng chính có thể tạo yêu cầu chụp và sửa đổi các tham số chụp.
Ứng dụng phụ: Tất cả các ứng dụng được chia sẻ khác đều là ứng dụng phụ. Ứng dụng phụ không thể tạo yêu cầu chụp cũng như không thể sửa đổi các tham số chụp. Ứng dụng phụ chỉ có thể gửi yêu cầu bắt đầu hoặc dừng truyền phát.
Đối với hoạt động truyền phát, dịch vụ máy ảnh sử dụng các tham số yêu cầu chụp mặc định cho mẫu xem trước. Nếu ứng dụng chính đang truyền phát, dịch vụ sẽ sử dụng các tham số yêu cầu chụp do ứng dụng chính chỉ định.
Định cấu hình phiên dùng chung
Để chia sẻ thiết bị máy ảnh, hãy cung cấp cấu hình phiên dùng chung trong tệp có tên shared_session_config.xml nằm trong /system_ext/etc/. Trong mẫu mã này, mã máy ảnh 0 hỗ trợ chia sẻ máy ảnh với 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. Các ứng dụng truy cập vào máy ảnh ở 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 ứng dụng truyền
không khớp với cấu hình phiên dùng chung, lệnh gọi
createCaptureSession sẽ không thành công.
API Java
CameraManager và CameraDevice cung cấp các API để mở máy ảnh ở chế độ dùng chung.
API CameraManager
CameraManager cung cấp các API sau:
isCameraDeviceSharingSupported: Các ứng dụng sử dụng API này để xác định xem máy ảnh có hỗ trợ chế độ dùng chung hay không.openSharedCamera: Nếu máy ảnh hỗ trợ chế độ dùng chung, các ứng dụng sẽ sử dụng API này để mở máy ảnh ở chế độ dùng chung.
API CameraDevice.StateCallback
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 máy ảnh đượ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 ứ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 máy ảnh.
CameraSharedCaptureSession
Lớp CameraSharedCaptureSession biểu thị một phiên chụp dùng chung.
Ở chế độ máy ảnh 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 sang CameraSharedCaptureSession.
Ứng dụng phụ không thể sử dụng createCaptureRequest. Thay vào đó, ứng dụng phụ
sử dụng API startStreaming để bắt đầu truyền phát trên các vùng chỉ định và
API stopStreaming để dừng truyền phát.
API Android NDK
Các ứng dụng tích hợp sử dụng các API Android NDK sau để mở máy ảnh ở chế độ dùng chung:
ACameraManager_isCameraDeviceSharingSupportedACameraManager_openSharedCameraACameraCaptureSessionShared_startStreamingACameraCaptureSessionShared_logicalCamera_startStreamingACameraCaptureSessionShared_stopStreamingACameraDevice_ClientSharedAccessPriorityChangedCallbackonClientSharedAccessPriorityChanged
Kiểm thử máy ảnh dùng chung
Hãy xem các bài kiểm thử dành riêng cho máy ảnh nhiều ứng dụng:
Bộ kiểm thử 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ế độ máy ảnh 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 phần mở rộng
- Phiên tốc độ cao
- Phiên ngoại tuyến
OutputConfigurationcó tính năng chia sẻ vùng- 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ở máy ảnh ở chế độ bình thường, hệ thống sẽ loại bỏ tất cả các ứng dụng máy ảnh dùng chung.