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

Không chỉ có các tính năng riêng lẻ: Đảm bảo sự kết hợp tính năng với CameraX 1.5

6 phút đọc
Tahsin Masrur
Kỹ sư phần mềm

Các ứng dụng camera 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 đợi quay video bằng 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à với tính năng Chống rung khi xem trước – thường là tất cả cùng một lúc.

Là nhà phát triển, chúng tôi biết rằng thực tế phức tạp hơn. Làm cách nào để bạn đả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 sự mạo hiểm. Bạn có thể kiểm tra khả năng hỗ trợ 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 camera 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, điều này ngăn người dùng trên các thiết bị có khả năng truy cập vào trải nghiệm tốt nhất có thể.

Ví dụ: rất ít thiết bị cao cấp hỗ trợ đồng thời video HDR và 60 khung hình/giây một cách đáng tin cậ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 để ngăn trải nghiệm người dùng kém trên phần lớn điện thoại.

Để giải quyết vấn đề này, chúng tôi xin giới thiệu Nhóm tính năng trong CameraX - một API mới được thiết kế để loại bỏ sự 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 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 những người mới sử dụng CameraX

Trước khi đi sâu vào API Nhóm tính năng mới, hãy nhanh chóng tóm tắt về 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 camera 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 bạn 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 API Nhóm tính năng

Bạn không còn 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ể – 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) – đồng thời tránh lỗi một cách khéo léo 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 khung hình/giây

unnamed (1).png

Trên một thiết bị cũ, nơi HDR và 60 khung hình/giây không thể chạy đồng thời, chỉ HDR được bật trong khi tuỳ chọn 60 khung hình/giây bị tắt.

Với API Nhóm tính năng, bạn có thể:

  • Xây dựng giao diện người dùng động, thông minh hơn: Bật hoặc tắt các chế độ cài đặt một cách thông minh trong giao diện người dùng 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ể làm mờ và tắt ngay tuỳ chọn 60 khung hình/giây nếu tổ hợp này không được hỗ trợ trên thiết bị đó. 
unsupported-features-disabled.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 các tính năng mong muốn được ưu tiê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 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 camera: Bằng cách xác minh khả năng hỗ trợ trước, bạn ngăn camera cố gắng định cấu hình một tổ hợp không được hỗ trợ, loại bỏ nguồn gốc phổ biến của sự cố và mang lại trải nghiệm người dùng mượt mà.

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 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_STABILIZATIONIMAGE_ULTRA_HDR. Do các giới hạn về tính toán, chỉ một tập hợp tính năng cụ thể có thể được nhóm với mức độ 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ẽ giới thiệu khả năng hỗ trợ cho nhiều tính năng hơn trong các bản phát hành trong tương lai.
  2. Tham số SessionConfig mới: Lớp này, được dùng để bắt đầu phiên camera, hiện chấp nhận 2 tham số mới:
    • requiredFeatureGroup: Sử dụng tham số 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ư chuyển đổi công tắc "HDR". Để đảm bảo trải nghiệm tất định và nhất quán, 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ì âm thầm 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 tham số 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 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à phương thức này sẽ trả về một giá trị boolean cho biết tổ hợp có được hỗ trợ hay không. Nếu bạn dự định liên kết một SessionConfig với các tính năng bắt buộc, trước tiên, bạn nên sử dụng API này để đảm bảo rằng API được hỗ trợ. 

Triển khai trong thực tế

Hãy xem 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ế độ "Nỗ lực hết mình" chất lượng cao

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 được ư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à Chống rung khi xem trước. CameraX xử lý sự phức tạp của việc kiểm tra tất cả các tổ hợp có thể và chọn tổ hợp tốt 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 khung hình/giây nhưng không có tính năng Chống rung khi xem trước, thì CameraX sẽ bật 2 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 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 phản ứng

Để tạo 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 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 những tính năng nào không tương thích với các 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ử 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 camera 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 kiểm thử 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ả 2 trường hợp "nỗ lực hết mình" 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 kiểm thử 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 tuyệt vời cho API Nhóm tính năng, nhưng ứng dụng này chưa được hoàn thiện để sử dụng trong quá trình phát hành chính thức.

Bắt đầu ngay hôm nay

API Nhóm tính năng loại bỏ sự mơ hồ khi làm việc với các khả năng nâng cao của camera. Bằng cách cung cấp một cách xác đị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 camera mạnh mẽ và đáng tin cậy hơn.

API này có dạng thử nghiệm trong CameraX 1.5 và dự kiến sẽ trở nên hoàn toàn ổn định trong bản phát hành 1.6, với nhiều tính năng hỗ trợ và cải tiến hơ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 thấy những gì bạn tạo ra và mong nhận được ý kiến phản hồi của bạn. Vui lòng chia sẻ ý kiế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