ภาพรวม CameraX
เหตุใดจึงเลือก CameraX แทน API กล้องแบบเดิม
ภาพรวม CameraX เป็นบทเรียน Android Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Android Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Android Academy มีบทเรียนทั้งหมด 4 บทเรียน
ทำไมต้องใช้ CameraX
ในอดีต การเพิ่มกล้องลงในแอป Android เป็นเรื่องยุ่งยาก API android.hardware.camera2 แบบเดิมมีความสามารถสูงแต่ต้องเขียนโค้ดยืดยาวมาก และทำงานแตกต่างกันไปบนอุปกรณ์นับพันรุ่นที่มีอยู่จริง
CameraX เป็นไลบรารี Jetpack ที่ทำงานอยู่บน Camera2 และมอบ API ที่ใช้งานง่าย รับรู้วงจรชีวิต และมีรูปแบบการทำงานสม่ำเสมอ ในหลักสูตรนี้คุณจะใช้ CameraX เพื่อแสดงภาพตัวอย่างแบบสด ถ่ายภาพ และบันทึกวิดีโอ
สิ่งที่ CameraX แก้ปัญหา
CameraX ได้รับการออกแบบโดยมีเป้าหมายสามประการ:
- ใช้งานง่าย — ต้องเขียนโค้ดประกอบน้อยกว่า Camera2 มาก
- ทำงานสม่ำเสมอ — Google ทดสอบกับชุดอุปกรณ์ขนาดใหญ่ อุปกรณ์ที่มีพฤติกรรมแตกต่างจึงทำงานได้อย่างคาดเดาได้
- รับรู้วงจรชีวิต — กล้องจะเริ่มและหยุดโดยอัตโนมัติตามวงจรชีวิตของหน้าจอ จึงไม่ทำให้กล้องค้างหรือรั่วไหล
คุณอธิบาย สิ่งที่ต้องการ เช่น ภาพตัวอย่าง ภาพถ่าย หรือวิดีโอ แล้ว CameraX จะจัดการ วิธีการทำสิ่งนั้นบนอุปกรณ์ปัจจุบันให้เอง
กรณีการใช้งานหลักสามแบบ
CameraX สร้างขึ้นโดยมี กรณีการใช้งานเป็นศูนย์กลาง กรณีการใช้งานคือส่วนการทำงานของกล้องที่แยกทำงานได้ในตัว กรณีหลักสามแบบคือ:
Preview— แสดงสิ่งที่กล้องมองเห็นบนหน้าจอImageCapture— ถ่ายภาพVideoCapture— บันทึกวิดีโอ
คุณสร้างกรณีการใช้งานที่ต้องการ แล้วเชื่อมโยงเข้ากับกล้อง
// You create the use cases you need:
val preview = Preview.Builder().build()
val imageCapture = ImageCapture.Builder().build()
// Later you bind them to a lifecycle and a camera.การเพิ่มส่วนพึ่งพา
CameraX ให้บริการเป็นอาร์ทิแฟกต์หลายรายการ คุณเพิ่มรายการเหล่านี้ลงใน build.gradle.kts ของโมดูล การตั้งค่าทั่วไปจะดึงไลบรารีหลัก แบ็กเอนด์ camera2 การผสานรวมกับวงจรชีวิต และตัวช่วยสำหรับมุมมองมาใช้
กำหนดให้อาร์ทิแฟกต์ของ CameraX ทั้งหมดใช้ เวอร์ชันเดียวกัน เพื่อหลีกเลี่ยงข้อขัดแย้ง
dependencies {
val cameraxVersion = "1.3.4"
implementation("androidx.camera:camera-core:$cameraxVersion")
implementation("androidx.camera:camera-camera2:$cameraxVersion")
implementation("androidx.camera:camera-lifecycle:$cameraxVersion")
implementation("androidx.camera:camera-view:$cameraxVersion")
implementation("androidx.camera:camera-video:$cameraxVersion")
}การประกาศสิทธิ์
หากต้องการใช้กล้อง คุณต้องประกาศสิทธิ์ CAMERA ใน AndroidManifest.xml หากคุณบันทึกวิดีโอด้วย คุณอาจต้องใช้ RECORD_AUDIO
สิทธิ์เหล่านี้เป็น สิทธิ์ขณะใช้งาน — การประกาศเพียงอย่างเดียวไม่เพียงพอ คุณต้องขอสิทธิ์จากผู้ใช้ขณะใช้งานด้วย (จะกล่าวถึงในบทเรียนถัดไป)
<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-feature
android:name="android.hardware.camera.any"
android:required="false" />CameraProvider
จุดเริ่มต้นของ CameraX คือ ProcessCameraProvider ซึ่งเชื่อมกรณีการใช้งานเข้ากับกล้องและวงจรชีวิตของหน้าจอ
คุณรับค่าดังกล่าวแบบอะซิงโครนัสด้วย getInstance() ซึ่งคืนค่าเป็น ListenableFuture ใน Kotlin คุณสามารถใช้ await() ภายในคอร์รูทีนได้
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.camera.core.ExperimentalGetImage
suspend fun Context.getCameraProvider(): ProcessCameraProvider {
return ProcessCameraProvider.getInstance(this).await()
}การเชื่อมกรณีการใช้งานเข้ากับวงจรชีวิต
เมื่อมี provider แล้ว คุณจะ เชื่อมกรณีการใช้งานเข้ากับ LifecycleOwner และ CameraSelector (กล้องหน้า หรือกล้องหลัง)
เนื่องจากการเชื่อมนี้รับรู้วงจรชีวิต CameraX จึงเปิดกล้องโดยอัตโนมัติเมื่อหน้าจอของคุณมองเห็นได้ และปิดกล้องเมื่อมองไม่เห็น — ไม่ต้องล้างทรัพยากรด้วยตนเอง
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
lifecycleOwner,
cameraSelector,
preview,
imageCapture
)การเลือกกล้อง
CameraSelector จะบอก CameraX ว่าควรใช้กล้องจริงตัวใด กล้องที่ใช้กันทั่วไปที่สุดสองแบบคือกล้องหลังเริ่มต้นและกล้องหน้าเริ่มต้น
คุณยังสามารถสร้างตัวเลือกแบบกำหนดเองเพื่อกำหนดให้ต้องมีคุณสมบัติเฉพาะได้ แต่ค่าเริ่มต้นก็ครอบคลุมแอปเกือบทุกประเภท
// Back camera (most common for photos)
val back = CameraSelector.DEFAULT_BACK_CAMERA
// Front camera (selfies, video calls)
val front = CameraSelector.DEFAULT_FRONT_CAMERA
// Toggle between them by swapping the selector and re-binding.PreviewView: พื้นที่แสดงผล
CameraX แสดงภาพตัวอย่างแบบสดลงใน PreviewView ซึ่งเป็น Android View ทั่วไปที่จัดการพื้นที่แสดงผล การปรับขนาด และการหมุนให้คุณ
ใน Jetpack Compose คุณฝังองค์ประกอบนี้ด้วย AndroidView ซึ่งช่วยให้คุณวาง View แบบดั้งเดิมไว้ภายใน composable ได้ คุณจะเชื่อมต่อทั้งหมดนี้อย่างสมบูรณ์ในบทเรียนถัดไป
AndroidView(
factory = { context ->
PreviewView(context).apply {
scaleType = PreviewView.ScaleType.FILL_CENTER
}
},
modifier = Modifier.fillMaxSize()
)การรับรู้วงจรชีวิตในการใช้งานจริง
ข้อดีที่เห็นได้ชัดที่สุดของ CameraX คือการรับรู้วงจรชีวิต เมื่อใช้ Camera2 คุณต้องเปิดกล้องด้วยตนเองใน onResume และคืนทรัพยากรใน onPause หากลืมทำเช่นนั้นอาจทำให้แอปล่มหรือกล้องค้าง
เมื่อใช้ CameraX หลังจากคุณเรียก bindToLifecycle เฟรมเวิร์กจะจัดการทั้งหมดให้ เมื่อผู้ใช้ออกจากหน้าจอ กล้องจะถูกคืนทรัพยากรโดยอัตโนมัติ และเมื่อกลับมา กล้องจะเปิดขึ้นอีกครั้ง
// No manual open/close needed.
// bindToLifecycle ties the camera to the screen's
// lifecycle, so it follows onStart/onStop for you.
cameraProvider.bindToLifecycle(lifecycleOwner, selector, preview)แบบจำลองในใจ
จดจำภาพรวมนี้ไว้ตลอดหลักสูตรที่เหลือ:
- รับ
ProcessCameraProvider - สร้าง กรณีการใช้งานที่ต้องการ (
Preview,ImageCapture,VideoCapture) - เลือก
CameraSelector - ใช้
bindToLifecycleเพื่อเชื่อมทุกอย่างเข้าด้วยกัน
ฟีเจอร์ทุกอย่างของ CameraX ล้วนเป็นรูปแบบหนึ่งของสี่ขั้นตอนนี้
ตรวจสอบอย่างรวดเร็ว
ทดสอบความเข้าใจพื้นฐานของ CameraX
สรุปทบทวน
ตอนนี้คุณเข้าใจภาพรวมของ CameraX แล้ว:
- CameraX ครอบการทำงานของ Camera2 ด้วย API ที่เรียบง่ายกว่า สม่ำเสมอกว่า และรับรู้วงจรชีวิต
- สร้างขึ้นโดยมี กรณีการใช้งานเป็นศูนย์กลาง ได้แก่
Preview,ImageCaptureและVideoCapture - คุณเพิ่มอาร์ทิแฟกต์ของ CameraX ประกาศสิทธิ์
CAMERAรับProcessCameraProviderและใช้bindToLifecycle CameraSelectorใช้เลือกกล้องหน้าเทียบกับกล้องหลัง ส่วนPreviewViewใช้แสดงภาพจากกล้อง
ถัดไป คุณจะเชื่อมต่อภาพตัวอย่างแบบสดจริงบนหน้าจอ
คำถามที่พบบ่อย
บทเรียน “ภาพรวม CameraX” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ภาพรวม CameraX” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Android Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Android Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ภาพรวม CameraX”
เหตุใดจึงเลือก CameraX แทน API กล้องแบบเดิม คุณปฏิบัติ Android Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Android Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Android Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “ภาพรวม CameraX” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Android Academy นี้ได้ไหม
ได้ บทเรียน Android Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ภาพรวม CameraX
- การแสดงตัวอย่างจากกล้อง
- การถ่ายภาพ
- การบันทึกวิดีโอ