Tin tức về sản phẩm

Ngoài các tính năng đơn lẻ: Đảm bảo kết hợp các tính năng với CameraX 1.5

6 phút đọc
Xem hồ sơ của Tahsin Masrur
Tahsin Masrur Kỹ sư phần mềm

Các ứng dụng máy ảnh hiện đại được xác định bằng các tính năng mạnh mẽ, chồng chéo. Người dùng mong muốn quay video HDR tuyệt đẹp, ghi lại chuyển động mượt mà ở tốc độ 60 khung hình/giây và có được cảnh quay mượt mà nhờ tính năng Ổn định bản xem trước, thường là tất cả cùng một lúc.

Là nhà phát triển, chúng ta biết rằng thực tế phức tạp hơn thế. Làm cách nào để đảm bảo rằng một thiết bị cụ thể thực sự hỗ trợ một tổ hợp nhất định? Cho đến nay, việc bật nhiều tính năng thường là một canh bạc. Bạn có thể kiểm tra khả năng hỗ trợ của từng tính năng, nhưng việc kết hợp các tính năng có thể dẫn đến hành vi không xác định hoặc tệ hơn là phiên máy ảnh không thành công.  Sự không chắc chắn này buộc nhà phát triển phải thận trọng, khiến người dùng trên các thiết bị có khả năng không thể tiếp cận trải nghiệm tốt nhất có thể.

Ví dụ: rất ít thiết bị cao cấp hỗ trợ ổn định đồng thời cả video HDR và video 60 khung hình/giây. Do đó, hầu hết các ứng dụng đều tránh bật cả hai tính năng cùng một lúc để không gây ra trải nghiệm kém cho người dùng trên phần lớn điện thoại.

Để giải quyết vấn đề này, chúng tôi sẽ ra mắt Nhóm tính năng trong CameraX – một API mới được thiết kế để loại bỏ việc phỏng đoán này. Giờ đây, bạn có thể truy vấn xem một tổ hợp tính năng cụ thể có được hỗ trợ hay không trước khi định cấu hình camera, hoặc chỉ cần cho CameraX biết các mức độ ưu tiên của bạn và để CameraX bật tổ hợp được hỗ trợ tốt nhất cho bạn.

Dành cho người mới sử dụng CameraX

Trước khi tìm hiểu về Feature Group API mới, hãy cùng điểm nhanh qua CameraX. CameraX là một thư viện hỗ trợ của Jetpack, được thiết kế để giúp bạn phát triển ứng dụng máy ảnh theo cách đơn giản hơn. CameraX cung cấp giao diện API nhất quán và dễ sử dụng, hoạt động trên hầu hết các thiết bị Android cùng khả năng tương thích ngược với Android 6.0 (cấp độ API 23). Nếu mới sử dụng CameraX, bạn nên xem tài liệu chính thức và thử lớp học lập trình để bắt đầu.

Những gì bạn có thể xây dựng bằng Feature Group API

Bạn không còn phải mạo hiểm với các tổ hợp tính năng và có thể tự tin mang đến trải nghiệm camera tốt nhất có thể (chẳng hạn như video HDR và 60 khung hình/giây đồng thời trên phần cứng có khả năng, ví dụ: Pixel 10 Pro) trong khi vẫn tránh được lỗi trên các thiết bị không hỗ trợ tổ hợp này.

unnamed.png
Pixel 10 Pro bật đồng thời cả HDR và 60 FPS
unnamed (1).png
Trên thiết bị cũ không thể chạy đồng thời HDR và 60 khung hình/giây, chỉ có HDR được bật trong khi tuỳ chọn 60 khung hình/giây bị tắt.

Với Feature Group API, bạn có thể:

  • Xây dựng giao diện người dùng thông minh hơn, linh động hơn: Bật hoặc tắt các chế độ cài đặt trong giao diện người dùng một cách thông minh dựa trên khả năng hỗ trợ phần cứng theo thời gian thực. Ví dụ: nếu người dùng bật HDR, bạn có thể ngay lập tức làm mờ và tắt tuỳ chọn 60 khung hình/giây nếu thiết bị đó không hỗ trợ tổ hợp này. 
hdr.gif
  • Cung cấp chế độ "Chất lượng cao" đáng tin cậy: Định cấu hình camera bằng danh sách ưu tiên các tính năng mong muốn. CameraX tự động tìm và bật tổ hợp được hỗ trợ tốt nhất cho mọi thiết bị, đảm bảo mang lại kết quả tuyệt vời mà không cần logic phức tạp, dành riêng cho thiết bị.
  • Ngăn chặn lỗi phiên máy ảnh: Bằng cách xác minh khả năng hỗ trợ trước, bạn sẽ ngăn máy ảnh cố gắng định cấu hình một tổ hợp không được hỗ trợ, loại bỏ nguồn gây sự cố thường gặp và mang lại trải nghiệm mượt mà cho người dùng.

Cách thức hoạt động: Các thành phần cốt lõi

API mới tập trung vào các thành phần bổ sung chính cho SessionConfig và CameraInfo.

  1. GroupableFeature: API này giới thiệu một tập hợp các tính năng có thể nhóm được xác định trước, chẳng hạn như HDR_HLG10, FPS_60, PREVIEW_STABILIZATION và IMAGE_ULTRA_HDR. Do các giới hạn về tính toán, chỉ một nhóm tính năng cụ thể mới có thể được nhóm lại với độ tin cậy cao mà API này cung cấp. Chúng tôi đang tích cực nỗ lực mở rộng danh sách này và sẽ hỗ trợ thêm nhiều tính năng trong các bản phát hành sau này.
     
  2. Thông số SessionConfig mới: Lớp này (dùng để bắt đầu một phiên camera) hiện chấp nhận hai thông số mới:
    • requiredFeatureGroup: Sử dụng chế độ này cho các tính năng phải được hỗ trợ để cấu hình thành công – lý tưởng cho các tính năng mà người dùng bật một cách rõ ràng, chẳng hạn như bật/tắt nút chuyển "HDR". Để đảm bảo trải nghiệm nhất quán và tất định, lệnh gọi bindToLifecycle sẽ gửi một IllegalArgumentException nếu tổ hợp được yêu cầu không được hỗ trợ, thay vì tự động bỏ qua yêu cầu về tính năng. Bạn nên sử dụng API CameraInfo#isFeatureGroupSupported (thông tin chi tiết bên dưới) để truy vấn kết quả này trước.
    • preferredFeatureGroup: Sử dụng chế độ này cho các tính năng mong muốn nhưng không bắt buộc, ví dụ: khi bạn muốn triển khai chế độ "Chất lượng cao" mặc định. Bạn cung cấp danh sách các tính năng mong muốn được sắp xếp theo mức độ ưu tiên và CameraX sẽ tự động bật tổ hợp có mức độ ưu tiên cao nhất mà thiết bị hỗ trợ.
  3. CameraInfo#isFeatureGroupSupported(): Đây là phương thức truy vấn cốt lõi để kiểm tra rõ ràng xem một nhóm tính năng có được hỗ trợ hay không, rất phù hợp để chỉ cung cấp các tuỳ chọn tính năng được hỗ trợ cho người dùng trong giao diện người dùng của ứng dụng. Bạn truyền một SessionConfig vào phương thức này và phương thức này sẽ trả về một giá trị boolean cho biết liệu tổ hợp đó có được hỗ trợ hay không. Nếu định liên kết một SessionConfig với các tính năng bắt buộc, thì trước tiên, bạn nên sử dụng API này để đảm bảo tính năng đó được hỗ trợ. 

Triển khai trong thực tế

Hãy cùng tìm hiểu cách sử dụng các thành phần này để xây dựng trải nghiệm camera tốt hơn.

Trường hợp 1: Chế độ chất lượng cao "Tốt nhất có thể"

Nếu muốn bật các tính năng tốt nhất có thể theo mặc định, bạn có thể cung cấp danh sách ưu tiên cho preferredFeatureGroup. Trong ví dụ này, chúng ta yêu cầu CameraX ưu tiên HDR, sau đó là 60 khung hình/giây và cuối cùng là tính năng Ổn định bản xem trước. CameraX xử lý sự phức tạp của việc kiểm tra tất cả các kiểu kết hợp có thể có và chọn kiểu kết hợp phù hợp nhất mà thiết bị hỗ trợ.

Ví dụ: nếu một thiết bị có thể xử lý đồng thời HDR và 60 FPS nhưng không thể xử lý cùng với tính năng Ổn định bản xem trước, thì CameraX sẽ bật hai tính năng đầu tiên và loại bỏ tính năng thứ ba. Bằng cách này, bạn sẽ có được trải nghiệm tốt nhất có thể mà không cần viết các quy trình kiểm tra phức tạp, dành riêng cho thiết bị.

cameraProvider.bindToLifecycle(

    lifecycleOwner,

    cameraSelector,

    SessionConfig(

        useCases = listOf(preview, videoCapture),

        // The order of features in this list determines their priority. 

        // CameraX will enable the best-supported combination based on these

        // priorities: HDR_HLG10 > FPS_60 > Preview Stabilization.  

        preferredFeatureGroup =

           listOf(HDR_HLG10, FPS_60, PREVIEW_STABILIZATION),

    ).apply {

        // (Optional) Get a callback with the enabled features

        // to update your UI. 

        setFeatureSelectionListener { selectedFeatures ->

            updateUiIndicators(selectedFeatures)

        }

    }

)

Đối với đoạn mã này, CameraX sẽ cố gắng bật các tổ hợp tính năng theo thứ tự ưu tiên sau, chọn tổ hợp đầu tiên mà thiết bị hỗ trợ đầy đủ:

  1. HDR + 60 khung hình/giây + Chống rung khi xem trước
  2. HDR + 60 khung hình/giây
  3. HDR + Chống rung khi xem trước
  4. HDR
  5. 60 khung hình/giây + Chống rung khi xem trước
  6. 60 khung hình/giây
  7. Chống rung khi xem trước
  8. Không có tính năng nào ở trên

Trường hợp 2: Xây dựng giao diện người dùng thích ứng

Để tạo một giao diện người dùng phản hồi các lựa chọn của người dùng và ngăn người dùng chọn một tổ hợp tính năng không được hỗ trợ, bạn có thể truy vấn trực tiếp để được hỗ trợ. Hàm bên dưới kiểm tra xem những tính năng nào không tương thích với lựa chọn hiện tại của người dùng, cho phép bạn tắt các phần tử trên giao diện người dùng tương ứng.

/**

 * Returns a list of features that are NOT supported in combination

 * with the currently selected features.

 */

fun getUnsupportedFeatures(

    currentFeatures: Set<GroupableFeature>

): Set<GroupableFeature> {

    val unsupportedFeatures = mutableSetOf<GroupableFeature>()

    val appFeatureOptions = setOf(HDR_HLG10, FPS_60, PREVIEW_STABILIZATION)


    // Iterate over every available feature option in your app. 

    appFeatureOptions.forEach { featureOption ->

        // Skip features the user has already selected. 

        if (currentFeatures.contains(featureOption)) return@forEach


        // Check if adding this new feature is supported. 

        val isSupported = cameraInfo.isFeatureGroupSupported(

            SessionConfig(

                useCases = useCases,

                // Check the new feature on top of existing ones.

                requiredFeatureGroup = currentFeatures + featureOption

            )

        )


        if (!isSupported) {

            unsupportedFeatures.add(featureOption)

        }

    }


    return unsupportedFeatures

}

Sau đó, bạn có thể kết nối logic này vào ViewModel hoặc bộ điều khiển giao diện người dùng để phản ứng với hoạt động đầu vào của người dùng và liên kết lại máy ảnh với cấu hình đảm bảo hoạt động.

// Invoked when user turns some feature on/off.

fun onFeatureChange(currentFeatures: Set<GroupableFeature>) {

    // Identify features that are unsupported with the current selection.

    val unsupportedFeatures = getUnsupportedFeatures(currentFeatures)



    // Update app UI so that users can't enable them.

    updateDisabledFeatures(unsupportedFeatures)



    // Since the UI now only allows selecting supported feature combinations, 

    // `currentFeatures` is always valid. This allows setting

    // `requiredFeatureGroup` directly, without needing to re-check for

    // support or set a feature selection listener.  

    cameraProvider.bindToLifecycle(

        lifecycleOwner,

        cameraSelector,

        SessionConfig(

            useCases = listOf(preview, videoCapture),

            requiredFeatureGroup = currentFeatures,

        )

    )

}

Để xem các khái niệm này trong một ứng dụng đang hoạt động, bạn có thể khám phá ứng dụng thử nghiệm nội bộ của chúng tôi. Ứng dụng này cung cấp cách triển khai hoàn chỉnh cho cả hai trường hợp "nỗ lực tối đa" và "giao diện người dùng phản ứng" được thảo luận ở trên.

Xin lưu ý: Đây là một ứng dụng thử nghiệm và không phải là mẫu được hỗ trợ chính thức. Mặc dù đây là tài liệu tham khảo hữu ích cho Feature Group API, nhưng tài liệu này chưa được hoàn thiện để sử dụng trong môi trường thực tế.

Bắt đầu ngay hôm nay

Feature Group API giúp loại bỏ sự mơ hồ khi làm việc với các tính năng nâng cao của camera. Bằng cách cung cấp một phương thức tất định để truy vấn khả năng hỗ trợ tính năng, bạn có thể tự tin xây dựng các ứng dụng máy ảnh mạnh mẽ và đáng tin cậy hơn.

API này được cung cấp dưới dạng thử nghiệm trong CameraX 1.5 và dự kiến sẽ hoạt động ổn định hoàn toàn trong bản phát hành 1.6, đồng thời sẽ có thêm nhiều tính năng hỗ trợ và cải tiến.

Để tìm hiểu thêm, hãy xem tài liệu chính thức. Chúng tôi rất mong được chiêm ngưỡng tác phẩm của bạn và nhận được ý kiến phản hồi từ bạn. Vui lòng chia sẻ ý kiến của bạn và báo cáo mọi vấn đề thông qua các kênh sau:

Tác giả:
Tiếp tục đọc