Bật nhiều camera

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, ImageReaderSurfaceView.

<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

CameraManagerCameraDevice 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:

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:

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
  • OutputConfiguration có 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.