Tin tức về sản phẩm
Ngoài các tính năng riêng lẻ: Đảm bảo sự kết hợp các tính năng bằng CameraX 1.5
Đọc trong 6 phút
Các ứng dụng camera hiện đại được xác định bằng các tính năng mạnh mẽ và chồng chéo. Người dùng mong muốn quay video có 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 tôi biết rằng thực tế phức tạp hơn nhiều. 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 việc mạo hiểm. 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 này 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 các nhà phát triển phải thận trọng, điều này khiến người dùng trên các thiết bị có khả năng không thể có được 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 FPS 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 cùng một lúc để ngăn chặ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 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 lựa chọn ư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 tìm hiểu về Feature Group API mới, hãy cùng xem nhanh CameraX là gì. 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 một 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 làm quen với 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 cần phải thử nghiệm 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 FPS đồ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 những thiết bị không hỗ trợ tổ hợp này.
Pixel 10 Pro cho phép sử dụng đồng thời cả HDR và tốc độ 60 khung hình/giây
Trên thiết bị cũ không thể chạy đồng thời HDR và 60 FPS, chỉ có HDR được bật trong khi lựa chọn 60 FPS bị tắt.
Với Feature Group API, bạn có thể:
- Tạo giao diện người dùng thông minh và linh hoạt hơn: Bật hoặc tắt 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ể làm mờ và tắt ngay lựa chọn 60 FPS nếu thiết bị đó không hỗ trợ sự kết hợp này.
- 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 gồm 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ị nhất định, đả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 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ỏ một nguồn gây ra sự cố phổ biến 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 điểm bổ sung chính cho SessionConfig và CameraInfo.
-
GroupableFeature: API này giới thiệu một nhóm 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 những hạn chế về khả năng tính toán, chỉ một nhóm tính năng cụ thể có thể được nhóm lại với độ tin cậy cao mà API này mang lại. Chúng tôi đang tích cực nỗ lực để mở rộng danh sách này và sẽ hỗ trợ nhiều tính năng hơn trong các bản phát hành sau này.
-
Các thông số SessionConfig mới: Lớp này (được dùng để bắt đầu một phiên máy ảnh) hiện chấp nhận 2 thông số mới:
requiredFeatureGroup: Sử dụng cho những tính năng phải được hỗ trợ để cấu hình thành công – lý tưởng cho những 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 công tắc "HDR". Để đảm bảo trải nghiệm thuật toán tất định và nhất quán, lệnh gọibindToLifecyclesẽ gửiIllegalArgumentExceptionnế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 APICameraInfo#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ợ.
-
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 lựa chọn về tính năng được hỗ trợ cho người dùng trong giao diện người dùng ứng dụng của bạn. Bạn truyền cho hàm này một
SessionConfigvà hàm 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 muốn liên kết mộtSessionConfigvớ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 tính năng đó đượ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 để tạo ra trải nghiệm chụp ảnh tốt hơn.
Trường hợp 1: Chế độ chất lượng cao "Cố gắng hết sức"
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 một 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 FPS và cuối cùng là tính năng 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ý HDR và 60 FPS cùng nhau nhưng không có 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 đây, chọn tổ hợp đầu tiên mà thiết bị hỗ trợ đầy đủ:
- HDR + 60 khung hình/giây + Chống rung khi xem trước
- HDR + 60 khung hình/giây
- HDR + Chống rung khi xem trước
- HDR
- 60 khung hình/giây + Chống rung khi xem trước
- 60 khung hình/giây
- Chống rung khi xem trước
- Không có tính năng nào nêu trên
Tình huống 2: Xây dựng giao diện người dùng phản ứng
Để tạo một giao diện người dùng phản hồi 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ể trực tiếp truy vấn để biết thông tin hỗ trợ. Hàm bên dưới kiểm tra những tính năng 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 vô hiệu hoá các phần tử tương ứng trên giao diện người dù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 hồi hoạt động đầu vào của người dùng và liên kết lại camera với một 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 một cách triển khai hoàn chỉnh cho cả hai trường hợp "cố gắng hết sức" 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à một 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 quá trình sản xuấ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 chức năng nâng cao của camera. Bằng cách cung cấp một cách thức xác định để truy vấn thông tin hỗ trợ tính năng, bạn có thể tự tin tạo ra các ứng dụng máy ảnh mạnh mẽ và đáng tin cậy hơn.
API này có sẵn dưới dạng thử nghiệm trong CameraX 1.5 và dự kiến sẽ hoàn toàn ổn định trong bản phát hành 1.6, với nhiều điểm hỗ trợ và cải tiến hơn nữa.
Để 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à mong nhận được ý kiến phản hồi của 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:
Tiếp tục đọc
-
Tin tức về sản phẩm
Android Studio Panda 4 hiện đã ổn định và sẵn sàng để bạn sử dụng trong bản phát hành chính thức. Bản phát hành này có Chế độ lập kế hoạch, tính năng Dự đoán nội dung chỉnh sửa tiếp theo và nhiều tính năng khác, giúp bạn dễ dàng tạo ứng dụng Android chất lượng cao hơn bao giờ hết.
Matt Dyor • Đọc trong 5 phút
-
Tin tức về sản phẩm
Nếu là nhà phát triển Android và muốn triển khai các tính năng AI cải tiến vào ứng dụng của mình, thì bạn có thể tham khảo những nội dung cập nhật mới và mạnh mẽ mà chúng tôi mới ra mắt gần đây.
Thomas Ezan • Đọc trong 3 phút
-
Tin tức về sản phẩm
Android 17 đã đạt đến bản beta 4, bản beta theo lịch trình cuối cùng của chu kỳ phát hành này, một cột mốc quan trọng đối với khả năng tương thích của ứng dụng và độ ổn định của nền tảng.
Daniel Galpin • Đọc trong 4 phút
Nhận thông tin cập nhật
Nhận thông tin chi tiết mới nhất về hoạt động phát triển trên Android trong hộp thư đến của bạn mỗi tuần.