Extensions API

CameraX cung cấp Extensions API để truy cập các hiệu ứng đặc biệt sau đây mà các nhà sản xuất đã triển khai trên nhiều thiết bị Android (Điện thoại, Máy tính bảng hoặc các thiết bị khác)

  • Tự động: Tự động điều chỉnh hình ảnh cuối cùng cho phù hợp với khung cảnh xung quanh. Ví dụ: Phương thức triển khai thư viện nhà cung cấp có thể thực hiện chức năng phát hiện điều kiện ánh sáng yếu và có thể chuyển sang chế độ ánh sáng yếu hoặc chế độ HDR để chụp ảnh, hoặc thư viện có thể tự động áp dụng chế độ làm đẹp khuôn mặt khi chụp ảnh chân dung. Chế độ tự động sẽ để phương thức triển khai thư viện nhà cung cấp lựa chọn chế độ.
  • Bokeh: Chế độ Bokeh giúp nhân vật trong nền trước có diện mạo sắc nét hơn và làm mờ nền của ảnh. Chế độ này thường dùng để chụp ảnh chân dung người tương tự như những ảnh do máy ảnh có ống kính lớn chụp.
  • Làm đẹp khuôn mặt: Chỉnh sửa lại màu da, hình dạng khuôn mặt, v.v. khi chụp ảnh tĩnh.
  • HDR (Dải động cao): Chế độ HDR chụp những ảnh duy trì phạm vi mức độ chiếu sáng lớn hơn của cảnh sao cho vẫn thấy rõ trong ảnh cuối cùng. Ví dụ: Khi chụp ảnh một đối tượng trước cửa sổ nhiều ánh sáng, bạn có thể nhìn thấy cả đối tượng và cảnh thông qua cửa sổ nếu sử dụng chế độ HDR. Còn ở chế độ bình thường, đối tượng hoặc cảnh có thể bị phơi sáng kém. Tuy nhiên, chế độ HDR thường mất nhiều thời gian hơn hẳn để chụp một ảnh, không có quyền kiểm soát của người dùng và có thể có các cấu phần mềm khác tùy thuộc vào phương thức HDR được sử dụng.
  • Đêm: Chụp ảnh tĩnh chất lượng nhất trong điều kiện ánh sáng yếu, thường là vào ban đêm.

Để hỗ trợ các tiện ích nhà cung cấp đó, thiết bị phải đáp ứng yêu cầu sau:

  • Hiệu ứng có hỗ trợ thư viện từ ROM thiết bị.
  • Thư viện ROM được cài đặt trên thiết bị hiện tại.
  • Thiết bị có phiên bản hệ điều hành mà thư viện yêu cầu.

Bạn có thể ưu tiên bật một tiện ích: nếu tiện ích vừa được thiết bị hỗ trợ vừa dùng thực tế trên thiết bị, thì tiện ích sẽ được bật; nếu không, tiện ích sẽ giảm cấp một cách linh hoạt.

Nhà cung cấp không bắt buộc phải cung cấp phương thức triển khai cho mọi hiệu ứng và tính năng. Bất kỳ khả năng nào không có phương thức triển khai do nhà cung cấp cung cấp sẽ mặc định triển khai bằng CameraX. Phương thức triển khai mặc định cho biết khả năng không sử dụng được và bỏ qua thao tác bật.

Cấu trúc tiện ích

Hình ảnh sau đây cho thấy cấu trúc của các tiện ích sử dụng CameraX.

Hình 1. Cấu trúc của các tiện ích sử dụng CameraX

Các tiện ích tách biệt với lõi Camera2 của CameraX. Trong sơ đồ, mũi tên màu đỏ cho biết luồng dữ liệu chính khi người dùng kích hoạt một tính năng dựa trên tiện ích, chẳng hạn như chụp ảnh HDR.

Bật hiệu ứng để chụp và xem trước ảnh

Trước khi sử dụng Extensions API, truy xuất thực thể ExtensionsManager bằng cách sử dụng phương thức ExtensionManager#getInstanceAsync(Context, CameraProvider). Hành động này sẽ cho phép bạn truy vấn thông tin về tình trạng sẵn có của tiện ích. Sau đó, truy xuất tiện ích đã bật CameraSelector. Chế độ tiện ích sẽ được áp dụng trong các trường hợp sử dụng chụp và xem trước ảnh khi gọi phương thức bindToLifecycle() và tiện ích CameraSelector đã bật.

Để triển khai tiện ích cho trường hợp sử dụng chụp và xem trước ảnh, hãy tham khảo mã mẫu sau:

Kotlin

import androidx.camera.extensions.ExtensionMode
import androidx.camera.extensions.ExtensionsManager

fun onCreate() {
    // Create a camera provider
    val cameraProvider : ProcessCameraProvider = ... // Get the provider instance

    lifecycleScope.launch {
        // Create an extensions manager
        val extensionsManager =
                ExtensionsManager.getInstanceAsync(context, cameraProvider).await()

        // Select the camera
        val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA

        // Query if extension is available.
        if (extensionsManager.isExtensionAvailable(
                cameraSelector,
                ExtensionMode.BOKEH
            )
        ) {
            // Unbind all use cases before enabling different extension modes.
            cameraProvider.unbindAll()

            // Retrieve extension enabled camera selector
            val bokehCameraSelector = extensionsManager.getExtensionEnabledCameraSelector(
                cameraSelector,
                ExtensionMode.BOKEH
            )

            // Bind image capture and preview use cases with the extension enabled camera selector.
            val imageCapture = ImageCapture.Builder().build()
            val preview = Preview.Builder().build()
            cameraProvider.bindToLifecycle(
                lifecycleOwner,
                bokehCameraSelector,
                imageCapture,
                preview
            )
        }
    }
}

Java

import androidx.camera.extensions.ExtensionMode;
import androidx.camera.extensions.ExtensionsManager;

void onCreate() {
    // Create a camera provider
    ProcessCameraProvider cameraProvider = ... // Get the provider instance

    // Call the getInstanceAsync function to retrieve a ListenableFuture object
    ListenableFuture future =
            ExtensionsManager.getInstanceAsync(context, cameraProvider);

    // Obtain the ExtensionsManager instance from the returned ListenableFuture object
    future.addListener(() -> {
        try {
            ExtensionsManager extensionsManager = future.get();

            // Select the camera
            CameraSelector cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA;

            // Query if extension is available.
            if (extensionsManager.isExtensionAvailable(cameraSelector, ExtensionMode.BOKEH)) {
                // Unbind all use cases before enabling different extension modes.
                cameraProvider.unbindAll();

                // Retrieve extension enabled camera selector
                CameraSelector bokehCameraSelector = extensionsManager
                    .getExtensionEnabledCameraSelector(cameraSelector, ExtensionMode.BOKEH);

                // Bind image capture and preview use cases with the extension enabled camera selector.
                ImageCapture imageCapture = new ImageCapture.Builder().build();
                Preview preview = new Preview.Builder().build();
                cameraProvider.bindToLifecycle(lifecycleOwner, bokehCameraSelector, imageCapture, preview);
            }
        } catch (ExecutionException | InterruptedException e) {
            // This should not happen unless the future is cancelled or the thread is interrupted by
            // applications.
        }
    }, ContextCompact.getMainExecutor(context));
}

Tắt hiệu ứng

Để tắt tiện ích của nhà cung cấp, hãy huỷ liên kết tất cả các trường hợp sử dụng và liên kết lại các trường hợp sử dụng chụp và xem trước ảnh bằng bộ chọn máy ảnh thông thường. Ví dụ: Liên kết lại với máy ảnh mặt sau bằng CameraSelector.DEFAULT_BACK_CAMERA.

Phần phụ thuộc

Extensions API của CameraX được triển khai trong thư viện camera-extensions. Các tiện ích phụ thuộc vào các mô-đun lõi của CameraX (core, camera2, lifecycle).

Groovy

dependencies {
  def camerax_version = "1.2.0-alpha04"
  implementation "androidx.camera:camera-core:${camerax_version}"
  implementation "androidx.camera:camera-camera2:${camerax_version}"
  implementation "androidx.camera:camera-lifecycle:${camerax_version}"
  //the CameraX Extensions library
  implementation "androidx.camera:camera-extensions:${camerax_version}"
    ...
}

Kotlin

dependencies {
  val camerax_version = "1.2.0-alpha04"
  implementation("androidx.camera:camera-core:${camerax_version}")
  implementation("androidx.camera:camera-camera2:${camerax_version}")
  implementation("androidx.camera:camera-lifecycle:${camerax_version}")
  // the CameraX Extensions library
  implementation("androidx.camera:camera-extensions:${camerax_version}")
    ...
}

Xoá API cũ

Với Extensions API mới được phát hành vào 1.0.0-alpha26, Extensions API cũ được phát hành vào tháng Tám năm 2019 hiện không còn được dùng nữa. Kể từ phiên bản 1.0.0-alpha28, Extensions API cũ đã bị xoá khỏi thư viện. Các ứng dụng sử dụng Extensions API mới hiện phải nhận được CameraSelector đã bật tiện ích và sử dụng công cụ này để liên kết các trường hợp sử dụng.

Các ứng dụng sử dụng Extensions API cũ phải chuyển sang Extensions API mới để đảm bảo khả năng tương thích trong tương lai với các bản phát hành CameraX sắp tới.

Tài nguyên khác

Để tìm hiểu thêm về CameraX, hãy tham khảo các tài nguyên bổ sung sau đây.

Lớp học lập trình

  • Bắt đầu sử dụng CameraX
  • Mã mẫu

  • Ứng dụng mẫu CameraX
  • Tài liệu tham khảo khác

    Tiện ích của nhà cung cấp CameraX

    Công cụ xác thực tiện ích của nhà cung cấp CameraX