มากกว่าฟีเจอร์เดียว: การรับประกันการผสมผสานฟีเจอร์ด้วย CameraX 1.5
อ่าน 6 นาที
แอปกล้องที่ทันสมัยมีฟีเจอร์ที่ทรงพลังและทับซ้อนกัน ผู้ใช้คาดหวังที่จะบันทึกวิดีโอด้วย HDR ที่น่าทึ่ง จับภาพการเคลื่อนไหวที่ลื่นไหลที่ 60 FPS และได้ฟุตเทจที่ราบรื่นด้วยการป้องกันภาพสั่นไหวแบบแสดงตัวอย่าง ซึ่งมักจะทำทั้งหมดนี้พร้อมกัน
ในฐานะนักพัฒนาแอป เราทราบดีว่าความเป็นจริงนั้นซับซ้อนกว่านี้ คุณจะรับประกันได้อย่างไรว่าอุปกรณ์หนึ่งๆ รองรับการทำงานร่วมกันที่กำหนด ก่อนหน้านี้ การเปิดใช้ฟีเจอร์หลายรายการมักเป็นการเสี่ยง คุณสามารถตรวจสอบการรองรับฟีเจอร์แต่ละรายการได้ แต่การใช้ฟีเจอร์ร่วมกันอาจทำให้เกิดลักษณะการทำงานที่ไม่คาดคิด หรืออาจทำให้เซสชันกล้องล้มเหลว ความไม่แน่นอนนี้ทำให้นักพัฒนาแอปต้องระมัดระวัง ซึ่งทำให้ผู้ใช้ในอุปกรณ์ที่มีประสิทธิภาพไม่สามารถเข้าถึงประสบการณ์การใช้งานที่ดีที่สุดได้
เช่น มีอุปกรณ์พรีเมียมเพียงไม่กี่รุ่นที่รองรับวิดีโอ HDR และ 60 FPS พร้อมกันได้อย่างเสถียร ด้วยเหตุนี้ แอปส่วนใหญ่จึงหลีกเลี่ยงการเปิดใช้ทั้ง 2 อย่างพร้อมกันเพื่อป้องกันไม่ให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ไม่ดีในโทรศัพท์ส่วนใหญ่
เราจึงขอแนะนำกลุ่มฟีเจอร์ใน CameraX ซึ่งเป็น API ใหม่ที่ออกแบบมาเพื่อขจัดปัญหาการคาดเดานี้ ตอนนี้คุณสามารถค้นหาว่าระบบรองรับฟีเจอร์ชุดค่าผสมที่เฉพาะเจาะจงหรือไม่ก่อนกำหนดค่ากล้อง หรือเพียงแค่บอก CameraX ว่าคุณให้ความสำคัญกับอะไร แล้วให้ CameraX เปิดใช้ชุดค่าผสมที่รองรับดีที่สุดให้คุณ
สำหรับผู้ที่เพิ่งเริ่มใช้ CameraX
ก่อนที่จะเจาะลึก Feature Group API ใหม่ เรามาทบทวนกันสั้นๆ ว่า CameraX คืออะไร CameraX เป็นไลบรารีการสนับสนุน Jetpack ที่สร้างขึ้นเพื่อช่วยให้การพัฒนาแอปกล้องง่ายขึ้น โดยมี API ที่สอดคล้องกันและใช้งานง่ายซึ่งทำงานได้ในอุปกรณ์ Android ส่วนใหญ่ และมีความเข้ากันได้แบบย้อนหลังกับ Android 6.0 (API ระดับ 23) หากคุณเพิ่งเริ่มใช้ CameraX เราขอแนะนำให้ดูเอกสารประกอบอย่างเป็นทางการและลองใช้ Codelab เพื่อเริ่มต้นใช้งาน
สิ่งที่คุณสร้างได้ด้วย Feature Group API
คุณไม่ต้องเสี่ยงกับการผสมฟีเจอร์ต่างๆ อีกต่อไป และสามารถมอบประสบการณ์การใช้งานกล้องที่ดีที่สุดได้อย่างมั่นใจ เช่น วิดีโอ HDR และ 60 FPS พร้อมกันในฮาร์ดแวร์ที่รองรับ (เช่น Pixel 10 Pro) พร้อมทั้งหลีกเลี่ยงข้อผิดพลาดในอุปกรณ์ที่ไม่รองรับการผสมฟีเจอร์ดังกล่าวได้อย่างราบรื่น
Feature Group API ช่วยให้คุณทำสิ่งต่อไปนี้ได้
- สร้าง UI แบบไดนามิกที่ชาญฉลาดยิ่งขึ้น: เปิดหรือปิดใช้การตั้งค่าใน UI อย่างชาญฉลาดโดยอิงตามการรองรับฮาร์ดแวร์แบบเรียลไทม์ เช่น หากผู้ใช้เปิดใช้ HDR คุณจะทำให้ตัวเลือก 60 FPS เป็นสีเทาและปิดใช้ได้ทันทีหากอุปกรณ์นั้นไม่รองรับการตั้งค่าดังกล่าว
- มอบโหมด "คุณภาพสูง" ที่เชื่อถือได้: กำหนดค่ากล้องด้วยรายการฟีเจอร์ที่ต้องการซึ่งจัดลำดับความสำคัญแล้ว CameraX จะค้นหาและเปิดใช้การผสมผสานที่รองรับได้ดีที่สุดสำหรับอุปกรณ์ที่กำหนดโดยอัตโนมัติ เพื่อให้มั่นใจว่าจะได้ผลลัพธ์ที่ยอดเยี่ยมโดยไม่ต้องใช้ตรรกะที่ซับซ้อนและเฉพาะเจาะจงสำหรับอุปกรณ์
- ป้องกันไม่ให้เซสชันกล้องล้มเหลว: การยืนยันการรองรับล่วงหน้าจะช่วยป้องกันไม่ให้กล้องพยายามกำหนดค่าชุดค่าผสมที่ไม่รองรับ ซึ่งจะช่วยขจัดสาเหตุทั่วไปที่ทำให้เกิดข้อขัดข้องและมอบประสบการณ์การใช้งานที่ราบรื่นแก่ผู้ใช้
วิธีการทำงาน: องค์ประกอบหลัก
API ใหม่นี้มุ่งเน้นไปที่การเพิ่มคีย์ไปยัง SessionConfig และ CameraInfo
- GroupableFeature: API นี้จะแนะนำชุดฟีเจอร์ที่จัดกลุ่มได้ซึ่งกำหนดไว้ล่วงหน้า เช่น HDR_HLG10, FPS_60, PREVIEW_STABILIZATION และ IMAGE_ULTRA_HDR เนื่องจากข้อจำกัดด้านการคำนวณ จึงมีเพียงชุดฟีเจอร์ที่เฉพาะเจาะจงเท่านั้นที่จัดกลุ่มได้ด้วยความน่าเชื่อถือสูงที่ API นี้มีให้ เรากำลังพยายามอย่างเต็มที่เพื่อขยายรายการนี้และจะรองรับฟีเจอร์อื่นๆ เพิ่มเติมในรุ่นต่อๆ ไป
- พารามิเตอร์ SessionConfig ใหม่: คลาสนี้ซึ่งใช้สําหรับเริ่มเซสชันกล้องตอนนี้ยอมรับพารามิเตอร์ใหม่ 2 รายการ
requiredFeatureGroup: ใช้สำหรับฟีเจอร์ที่ต้องรองรับเพื่อให้การกำหนดค่าสำเร็จ ซึ่งเหมาะสำหรับฟีเจอร์ที่ผู้ใช้เปิดใช้โดยชัดแจ้ง เช่น การสลับสวิตช์ "HDR" การเรียกใช้bindToLifecycleจะแสดงIllegalArgumentExceptionหากระบบไม่รองรับการผสมผสานที่ขอ เพื่อให้มั่นใจว่าประสบการณ์การใช้งานจะมีความสอดคล้องและกำหนดได้ แทนที่จะเพิกเฉยต่อคำขอฟีเจอร์โดยไม่แจ้ง คุณควรใช้CameraInfo#isFeatureGroupSupportedAPI (รายละเอียดด้านล่าง) เพื่อค้นหาผลลัพธ์นี้ล่วงหน้าpreferredFeatureGroup: ใช้สำหรับฟีเจอร์ที่ต้องการแต่ไม่บังคับ เช่น เมื่อต้องการใช้โหมด "คุณภาพสูง" เป็นค่าเริ่มต้น คุณระบุรายการฟีเจอร์ที่ต้องการเรียงตามลำดับความสำคัญ แล้ว CameraX จะเปิดใช้ชุดค่าผสมที่มีลำดับความสำคัญสูงสุดที่อุปกรณ์รองรับโดยอัตโนมัติ
- CameraInfo#isFeatureGroupSupported(): นี่คือเมธอดการค้นหาหลักสำหรับการตรวจสอบอย่างชัดเจนว่ารองรับกลุ่มฟีเจอร์หรือไม่ เหมาะอย่างยิ่งสำหรับการแสดงเฉพาะตัวเลือกฟีเจอร์ที่รองรับต่อผู้ใช้ใน UI ของแอป คุณส่ง
SessionConfigไปยังฟังก์ชันนี้ และฟังก์ชันจะแสดงผลบูลีนที่ระบุว่าระบบรองรับการผสมผสานดังกล่าวหรือไม่ หากต้องการเชื่อมโยงSessionConfigกับฟีเจอร์ที่จำเป็น คุณควรใช้ API นี้ก่อนเพื่อให้แน่ใจว่าระบบรองรับ
การใช้งานในทางปฏิบัติ
มาดูวิธีใช้คอมโพเนนต์เหล่านี้เพื่อสร้างประสบการณ์การใช้งานกล้องที่ดีขึ้นกัน
สถานการณ์ที่ 1: โหมดคุณภาพสูง "ดีที่สุด"
หากต้องการเปิดใช้ฟีเจอร์ที่ดีที่สุดเท่าที่จะเป็นไปได้โดยค่าเริ่มต้น คุณสามารถระบุรายการที่มีลำดับความสำคัญให้ preferredFeatureGroup ได้ ในตัวอย่างนี้ เราบอกให้ CameraX จัดลำดับความสำคัญของ HDR ก่อน ตามด้วย 60 FPS และสุดท้ายคือการป้องกันภาพสั่นของตัวอย่าง CameraX จะจัดการความซับซ้อนของการตรวจสอบชุดค่าผสมที่เป็นไปได้ทั้งหมดและเลือกชุดค่าผสมที่ดีที่สุดที่อุปกรณ์รองรับ
เช่น หากอุปกรณ์รองรับ HDR และ 60 FPS พร้อมกัน แต่ไม่รองรับการป้องกันภาพสั่นไหวในตัวอย่าง CameraX จะเปิดใช้ 2 อย่างแรกและทิ้งอย่างที่ 3 ด้วยวิธีนี้ คุณจะได้รับประสบการณ์การใช้งานที่ดีที่สุดโดยไม่ต้องเขียนการตรวจสอบที่ซับซ้อนและเฉพาะเจาะจงสำหรับอุปกรณ์
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)
}
}
)สำหรับข้อมูลโค้ดนี้ CameraX จะพยายามเปิดใช้ชุดค่าผสมของฟีเจอร์ตามลำดับความสำคัญต่อไปนี้ โดยเลือกชุดค่าผสมแรกที่อุปกรณ์รองรับอย่างเต็มที่
- HDR + 60 FPS + การป้องกันภาพสั่นไหวขณะแสดงตัวอย่าง
- HDR + 60 FPS
- HDR + การป้องกันภาพสั่นไหวในตัวอย่าง
- HDR
- 60 FPS + ระบบกันภาพสั่นของตัวอย่าง
- 60 FPS
- แสดงตัวอย่างระบบกันภาพสั่น
- ไม่มีฟีเจอร์ใดๆ ข้างต้น
สถานการณ์ที่ 2: การสร้าง UI แบบรีแอ็กทีฟ
หากต้องการสร้าง UI ที่ตอบสนองต่อการเลือกของผู้ใช้และป้องกันไม่ให้ผู้ใช้เลือกชุดฟีเจอร์ที่ไม่รองรับ คุณสามารถค้นหาการรองรับได้โดยตรง ฟังก์ชันด้านล่างจะตรวจสอบว่าฟีเจอร์ใดไม่สามารถใช้งานร่วมกับตัวเลือกปัจจุบันของผู้ใช้ได้ เพื่อให้คุณปิดใช้องค์ประกอบ UI ที่เกี่ยวข้องได้
/**
* 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
}จากนั้นคุณสามารถเชื่อมต่อตรรกะนี้กับ ViewModel หรือตัวควบคุม UI เพื่อตอบสนองต่อข้อมูลจากผู้ใช้และเชื่อมโยงกล้องอีกครั้งด้วยการกำหนดค่าที่รับประกันว่าจะใช้งานได้
// 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,
)
)
}หากต้องการดูแนวคิดเหล่านี้ในแอปพลิเคชันที่ใช้งานได้ คุณสามารถสำรวจแอปทดสอบภายในของเรา ซึ่งมีการใช้งานทั้งสถานการณ์ "พยายามอย่างเต็มที่" และ "UI แบบโต้ตอบ" ที่กล่าวถึงข้างต้นอย่างครบถ้วน
โปรดทราบว่าแอปพลิเคชันนี้เป็นแอปพลิเคชันทดสอบและไม่ใช่ตัวอย่างที่รองรับอย่างเป็นทางการ แม้ว่าจะเป็นข้อมูลอ้างอิงที่ยอดเยี่ยมสำหรับ Feature Group API แต่ก็ยังไม่ได้ปรับปรุงให้พร้อมใช้งานจริง
เริ่มต้นใช้งานวันนี้
Feature Group API ช่วยลดความคลุมเครือในการทำงานกับความสามารถของกล้องขั้นสูง การระบุวิธีที่แน่นอนในการค้นหาการรองรับฟีเจอร์จะช่วยให้คุณสร้างแอปกล้องถ่ายรูปที่ทรงพลังและเชื่อถือได้มากขึ้นอย่างมั่นใจ
API นี้พร้อมใช้งานใน CameraX 1.5 ในรูปแบบทดลอง และมีกำหนดจะกลายเป็นเวอร์ชันที่เสถียรอย่างเต็มรูปแบบในรุ่น 1.6 โดยจะมีการรองรับและการปรับปรุงเพิ่มเติมในอนาคต
ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบอย่างเป็นทางการ เราจะรอดูผลงานของคุณและหวังเป็นอย่างยิ่งว่าจะได้รับฟังความคิดเห็นจากคุณ โปรดแสดงความคิดเห็นและรายงานปัญหาผ่านช่องทางต่อไปนี้
-
ข่าวสารเกี่ยวกับผลิตภัณฑ์ใน Google Play เราขยายแพลตฟอร์มการสมัครใช้บริการอย่างต่อเนื่องเพื่อช่วยให้คุณขับเคลื่อนการเติบโต ปรับตัวให้เข้ากับโมเดลธุรกิจใหม่ๆ และเข้าถึงผู้ใช้ได้ตรงจุด
Sheenam Mittal • อ่าน 4 นาที -
ข่าวสารเกี่ยวกับผลิตภัณฑ์เมื่อปีที่แล้ว Android Studio ได้เปิดให้ใช้โมเดล AI ใดก็ได้ วันนี้เราจะก้าวไปอีกขั้นด้วยการเปิดตัวการรองรับเอเจนต์การเขียนโค้ดที่คุณเลือก
Matthew Warner • ใช้เวลาอ่าน 3 นาที -
ข่าวสารเกี่ยวกับผลิตภัณฑ์Googlebook เปิดตัวแล็ปท็อปหมวดหมู่ใหม่ที่สร้างขึ้นบนพื้นฐาน Android ที่ใช้ร่วมกัน ฮาร์ดแวร์ประสิทธิภาพสูงจากพาร์ทเนอร์ เช่น HP, Dell, Lenovo, Acer และ Asus ผสานความสะดวกในการใช้งานบนอุปกรณ์เคลื่อนที่เข้ากับประสิทธิภาพของเดสก์ท็อป
Fahd Imtiaz, Loryn Hairston • อ่าน 4 นาที
รับข้อมูลเชิงลึกด้านการพัฒนา Android ล่าสุดส่งตรงถึงกล่องจดหมายของคุณทุกสัปดาห์