ข่าวสารผลิตภัณฑ์
นอกเหนือจากฟีเจอร์เดียว: การรับประกันการรวมฟีเจอร์ด้วย 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) พร้อมหลีกเลี่ยงข้อผิดพลาดในอุปกรณ์ที่ไม่รองรับการผสมผสานนี้ได้อย่างราบรื่น
Pixel 10 Pro เปิดใช้ทั้ง HDR และ 60 FPS พร้อมกัน
ในอุปกรณ์รุ่นเก่าที่ HDR และ 60 FPS ทำงานพร้อมกันไม่ได้ ระบบจะเปิดใช้เฉพาะ HDR ในขณะที่ปิดใช้ตัวเลือก 60 FPS
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 โดยจะมีการรองรับและการปรับปรุงเพิ่มเติมในอนาคต
ดูข้อมูลเพิ่มเติมได้ในเอกสารประกอบอย่างเป็นทางการ เราตั้งตารอดูผลงานของคุณและรอรับฟังความคิดเห็นจากคุณ โปรดแชร์ความคิดเห็นและรายงานปัญหาผ่านช่องทางต่อไปนี้
อ่านต่อ
-
ข่าวสารผลิตภัณฑ์
Android Studio Panda 4 พร้อมให้คุณใช้ในเวอร์ชันที่ใช้งานจริงแล้ว การเปิดตัวครั้งนี้มาพร้อมโหมดการวางแผน การคาดการณ์การแก้ไขครั้งถัดไป และอื่นๆ ซึ่งจะช่วยให้การสร้างแอป Android คุณภาพสูงง่ายกว่าที่เคย
Matt Dyor • ใช้เวลาอ่าน 5 นาที
-
ข่าวสารผลิตภัณฑ์
หากคุณเป็นนักพัฒนาแอป Android ที่ต้องการใช้ฟีเจอร์ AI ที่เป็นนวัตกรรมใหม่ในแอป เราได้เปิดตัวการอัปเดตใหม่ที่มีประสิทธิภาพไปเมื่อเร็วๆ นี้
Thomas Ezan • ใช้เวลาอ่าน 3 นาที
-
ข่าวสารผลิตภัณฑ์
Android 17 ได้เปิดตัวเบต้า 4 ซึ่งเป็นเบต้าสุดท้ายที่กำหนดไว้ในรอบการเผยแพร่นี้ ซึ่งเป็นเป้าหมายสำคัญสำหรับความเข้ากันได้ของแอปและความเสถียรของแพลตฟอร์ม
Daniel Galpin • ใช้เวลาอ่าน 4 นาที
รับข่าวสาร
รับข้อมูลเชิงลึกด้านการพัฒนาแอป Android ล่าสุดส่งตรงถึงกล่องจดหมายของคุณทุกสัปดาห์