ข่าวสารเกี่ยวกับผลิตภัณฑ์
มากกว่าฟีเจอร์เดียว: การรับประกันการทำงานร่วมกันของฟีเจอร์ด้วย CameraX 1.5
อ่าน 6 นาที
แอปกล้องถ่ายรูปสมัยใหม่โดดเด่นด้วยฟีเจอร์ที่ทรงพลังและทำงานร่วมกันได้ ผู้ใช้คาดหวังว่าจะได้บันทึกวิดีโอด้วย HDR ที่สวยงาม จับภาพการเคลื่อนไหวที่ลื่นไหลที่ 60 FPS และได้ฟุตเทจที่ราบรื่นด้วยการป้องกันภาพสั่นไหวในตัวอย่าง ซึ่งมักจะเกิดขึ้นพร้อมๆ กัน
ในฐานะนักพัฒนาแอป เราทราบดีว่าความเป็นจริงนั้นซับซ้อนกว่า คุณจะรับประกันได้อย่างไรว่าอุปกรณ์หนึ่งๆ รองรับการทำงานร่วมกันของฟีเจอร์ที่เฉพาะเจาะจง จนถึงตอนนี้ การเปิดใช้ฟีเจอร์หลายรายการมักเป็นการเสี่ยง คุณอาจตรวจสอบการรองรับฟีเจอร์แต่ละรายการได้ แต่การรวมฟีเจอร์เหล่านั้นเข้าด้วยกันอาจทำให้เกิดลักษณะการทำงานที่ไม่แน่นอนหรือแย่กว่านั้นคือเซสชันกล้องถ่ายรูปไม่สำเร็จ ความไม่แน่นอนนี้บังคับให้นักพัฒนาแอปต้องระมัดระวัง ซึ่งทำให้ผู้ใช้ในอุปกรณ์ที่มีความสามารถไม่สามารถเข้าถึงประสบการณ์การใช้งานที่ดีที่สุด
ตัวอย่างเช่น มีอุปกรณ์ระดับพรีเมียมเพียงไม่กี่รุ่นที่รองรับวิดีโอ HDR และ 60 FPS พร้อมกันได้อย่างน่าเชื่อถือ ด้วยเหตุนี้ แอปส่วนใหญ่จึงหลีกเลี่ยงการเปิดใช้ทั้ง 2 อย่างพร้อมกันเพื่อป้องกันไม่ให้ผู้ใช้ส่วนใหญ่ได้รับประสบการณ์การใช้งานที่ไม่ดี
เพื่อแก้ไขปัญหานี้ เราจึงขอแนะนำ Feature Group ใน CameraX - API ใหม่ที่ออกแบบมาเพื่อขจัดความไม่แน่นอนนี้ ตอนนี้คุณสามารถค้นหาว่ามีการรองรับการทำงานร่วมกันของฟีเจอร์ที่เฉพาะเจาะจงหรือไม่ ก่อน กำหนดค่ากล้อง หรือเพียงแค่บอก CameraX ถึงลำดับความสำคัญของคุณ แล้วให้ CameraX เปิดใช้การทำงานร่วมกันของฟีเจอร์ที่รองรับได้ดีที่สุดให้คุณ
สำหรับผู้ที่เพิ่งเริ่มใช้ CameraX
ก่อนที่จะเจาะลึก API ของ Feature Group ใหม่ เรามาสรุปสั้นๆ เกี่ยวกับ CameraX กันก่อน CameraX คือไลบรารีการสนับสนุน Jetpack ที่สร้างขึ้นเพื่อช่วยให้คุณพัฒนาแอปกล้องถ่ายรูปได้ง่ายขึ้น โดยมีพื้นผิว API ที่สอดคล้องกันและใช้งานง่าย ซึ่งทำงานได้ในอุปกรณ์ Android ส่วนใหญ่ และมีความเข้ากันได้แบบย้อนกลับกับ Android 6.0 (API ระดับ 23) หากคุณเพิ่งเริ่มใช้ CameraX เราขอแนะนำให้ดูเอกสารประกอบอย่างเป็นทางการและลองใช้Codelabเพื่อเริ่มต้นใช้งาน
สิ่งที่คุณสร้างได้ด้วย API ของ Feature Group
คุณไม่จำเป็นต้องเสี่ยงกับการทำงานร่วมกันของฟีเจอร์อีกต่อไป และสามารถมอบประสบการณ์การใช้งานกล้องถ่ายรูปที่ดีที่สุดได้อย่างมั่นใจ เช่น วิดีโอ HDR และ 60 FPS พร้อมกันในฮาร์ดแวร์ที่มีความสามารถ (เช่น Pixel 10 Pro) พร้อมทั้งหลีกเลี่ยงข้อผิดพลาดอย่างราบรื่นในอุปกรณ์ที่ไม่รองรับการทำงานร่วมกัน
Pixel 10 Pro เปิดใช้ทั้ง HDR และ 60 FPS พร้อมกัน
ในอุปกรณ์รุ่นเก่าที่ HDR และ 60 FPS ไม่สามารถทำงานพร้อมกันได้ ระบบจะเปิดใช้เฉพาะ HDR ขณะที่ตัวเลือก 60 FPS จะปิดใช้
API ของ Feature Group ช่วยให้คุณทำสิ่งต่อไปนี้ได้
- สร้าง 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หากไม่มีการรองรับการทำงานร่วมกันของฟีเจอร์ที่ขอแทนที่จะละเว้นคำขอฟีเจอร์อย่างเงียบๆ คุณควรใช้ APICameraInfo#isFeatureGroupSupported(ดูรายละเอียดด้านล่าง) เพื่อค้นหาผลลัพธ์นี้ล่วงหน้า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 เชิงโต้ตอบ" ที่กล่าวถึงข้างต้นอย่างสมบูรณ์
โปรดทราบว่านี่เป็นแอปพลิเคชันทดสอบและไม่ใช่ตัวอย่างที่รองรับอย่างเป็นทางการ แม้ว่าจะเป็นข้อมูลอ้างอิงที่ยอดเยี่ยมสำหรับ API ของ Feature Group แต่ก็ยังไม่ได้รับการปรับปรุงให้พร้อมใช้งานจริง
เริ่มต้นใช้งานได้เลยวันนี้
API ของ Feature Group ช่วยขจัดความไม่แน่นอนในการทำงานร่วมกับความสามารถขั้นสูงของกล้องถ่ายรูป การระบุวิธีที่แน่นอนในการค้นหาการรองรับฟีเจอร์จะช่วยให้คุณสร้างแอปกล้องถ่ายรูปที่ทรงพลังและเชื่อถือได้มากขึ้นได้อย่างมั่นใจ
API นี้พร้อมให้ใช้งานเป็นแบบทดลองใน CameraX 1.5 และมีกำหนดจะพร้อมให้ใช้งานอย่างเสถียรในรุ่น 1.6 พร้อมการรองรับและการปรับปรุงเพิ่มเติม
ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบอย่างเป็นทางการ เราอดใจรอดูสิ่งที่คุณจะสร้างไม่ไหวแล้ว และหวังว่าจะได้รับความคิดเห็นจากคุณ โปรดแสดงความคิดเห็นและรายงานปัญหาผ่านช่องทางต่อไปนี้
อ่านต่อ
-
ข่าวสารเกี่ยวกับผลิตภัณฑ์
Android กำลังเปลี่ยนจากระบบปฏิบัติการเป็นระบบอัจฉริยะ ซึ่งจะสร้างโอกาสในการมีส่วนร่วมกับแอปของคุณมากขึ้น โดยมีการประกาศในวันนี้ระหว่าง The Android Show
Matthew McCullough • อ่าน 4 นาที
-
ข่าวสารเกี่ยวกับผลิตภัณฑ์
ระบบนิเวศของอุปกรณ์เคลื่อนที่มีการพัฒนาอยู่เสมอ ซึ่งนำมาซึ่งโอกาสใหม่ๆ และภัยคุกคามใหม่ๆ แม้จะมีการเปลี่ยนแปลงเหล่านี้ แต่ Android และ Google Play ยังคงมุ่งมั่นที่จะทำให้ผู้ใช้หลายพันล้านคนสามารถเพลิดเพลินกับแอปได้อย่างมั่นใจและนักพัฒนาแอปสามารถสร้างสรรค์นวัตกรรมได้อย่างเต็มที่
Vijaya Kaza • อ่าน 3 นาที
-
ข่าวสารเกี่ยวกับผลิตภัณฑ์
Jetpack Compose รุ่นเมษายน '26 พร้อมให้ใช้งานอย่างเสถียรแล้ว รุ่นนี้มีโมดูลหลักของ Compose เวอร์ชัน 1.11 (ดูการแมป BOM แบบเต็ม), เครื่องมือแก้ไขข้อบกพร่องขององค์ประกอบที่แชร์, เหตุการณ์ของแทร็กแพด และอื่นๆ
Meghan Mehta • อ่าน 5 นาที
รับข่าวสาร
รับข้อมูลเชิงลึกล่าสุดเกี่ยวกับการพัฒนา Android ส่งตรงถึงกล่องจดหมายของคุณ ทุกสัปดาห์