ในที่สุดก็ถึงเวลาอันเหมาะสมที่จะหยิบเรื่องราวของ CameraX มาเล่าสู่กันฟังเสียที เพราะนี่คือ 1 ในไลบรารีที่เจ้าของบล็อกรอคอยมากๆตัวหนึ่งเลยก็ว่าได้

บทความทั้งหมดในซีรีย์นี้

CameraX คืออะไร?

เป็นไลบรารีตัวหนึ่งที่อยู่ใน Android Jetpack ที่ช่วยทำให้นักพัฒนาสามารถทำงานได้ง่ายขึ้น สะดวกขึ้น เช่นเดียวกับไลบรารีตัวอื่นๆในนั้น โดย CameraX มีเป้าหมายเพื่อช่วยให้นักพัฒนาเรียกใช้งานกล้องของอุปกรณ์แอนดรอยด์ได้ง่ายขึ้นนั่นเอง

การเรียกใช้งานกล้องบนแอนดรอยด์นั้นไม่ได้เรื่องง่ายสำหรับนักพัฒนาเท่าไร เนื่องจากอุปกรณ์แอนดรอยด์แต่ละตัวนั้นมีสเปคของกล้องแตกต่างกัน ไม่ว่าจะเป็น จำนวนกล้อง ความละเอียดของภาพ ระยะโฟกัส รูรับแสง โหมดในการถ่ายภาพ และอื่นๆอีกมากมาย

จึงทำให้กล้องในอุปกรณ์แอนดรอยด์กลายเป็น Fragmentation อย่างหนึ่งของการพัฒนาแอนดรอยด์ (เยอะกว่าขนาดหน้าจอของแอนดรอยด์เสียอีก) เพื่อให้รองรับกับความหลากหลายของกล้อง จึงทำให้ Camera API ในแอนดรอยด์จะต้องมีความยืดหยุ่นมากๆ และในขณะเดียวกันก็กลายเป็นภาระให้กับนักพัฒนาเช่นกัน

จุดเด่นของ CameraX

โดยปกติแล้วการเขียนแอปที่ต้องเรียกใช้งานกล้องในเครื่อง มักจะเรียกแอปกล้องตัวอื่นๆในเครื่องเพื่อให้ทำหน้าที่นั้นแทนแล้วส่งรูปภาพกลับมาให้ แต่ในบางครั้งนักพัฒนาก็ต้องเขียนโค้ดเพื่อใช้งานกล้องไว้ในแอปของตัวเอง ซึ่งจะเรียกไปเรียก Camera v1 สำหรับเวอร์ชันที่ต่ำกว่า Android 5.0 Lollipop (API 21) และ Camera API v2 สำหรับเวอร์ชันที่สูงกว่านั้น

ซึ่งแอปส่วนใหญ่ถ้าไม่ได้ใช้ความสามารถของกล้องมากนัก แค่ถ่ายรูปธรรมดาๆ ก็จะใช้ Camera API v1 เพราะคำสั่งนั้นใช้งานง่ายกว่า Camera API v2 (อยากรู้ว่าซับซ้อนยังไง แนะนำให้ลองไปเขียนดูซักครั้ง)

ในขณะที่ทีมแอนดรอยด์ก็อยากจะผลักดันให้นักพัฒนาใช้ Camera API v2 เพราะคำสั่งที่ดีและใหม่กว่า แต่ก็เข้าใจถึงปัญหาของนักพัฒนาที่มองว่ามันเรียกใช้งานยุ่งยากจนเกินไป จึงได้ออกแบบ CameraX ขึ้นมาให้ใช้งานง่ายเหมือน Camera API v1 โดยที่เรียกใช้คำสั่งบน Camera API v2

Consistency Across Devices

CameraX ช่วยจัดการกับสเปคกล้องของแต่ละรุ่น แต่ละยี่ห้อให้ด้วย ซึ่งเป็นการร่วมมือของทีม Google กับผู้ผลิตอุปกรณ์แอนดรอยด์เจ้าใหญ่ๆ จนถึงกับลงทุนสร้างเป็น Test Labs ขึ้นมาเพื่อให้มั่นใจว่าคำสั่งของ CameraX จะครอบคลุมกับอุปกรณ์แอนดรอยด์ในตลาดจริงๆ

นักพัฒนาจึงไม่ต้องกังวลว่าจะต้องมานั่งแก้ปัญหากับอุปกรณ์แอนดรอยด์บางรุ่นเอง แบบที่เคยเจอตอนใช้ Camera API v1 หรือ Camera API v2 (จริงๆก็น่าจะมีแหละ แต่จะเจอน้อยลงกว่าเดิม)

Extension Features

นักพัฒนาสามารถเรียกใช้ความสามารถใหม่ๆของกล้องอย่าง Portrait Mode, HDR Mode, Night Mode หรือ Beauty Mode อีกด้วย ซึ่งแยกออกมาเป็น Extension ของ CameraX อีกทีหนึ่ง โดยที่นักพัฒนาไม่ต้องไปเขียนเองทั้งหมด

ข้อจำกัดของ CameraX

เอาเข้าจริง ข้อจำกัดเดียวของ CameraX ก็คือรองรับเฉพาะ Android 5.0 Lollipop (API 21) ขึ้นไปเท่านั้น เพราะว่าคำสั่งต่างๆใน CameraX จะเขียนด้วย Camera API v2 ทั้งหมด

ซึ่งในปัจจุบันนี้แอปส่วนใหญ่ก็สามารถกำหนด Min SDK เป็น API 21 ได้แล้ว จึงไม่น่าจะต้องกังวลอะไรมากนัก แต่ถ้าแอปยังต้องรองรับเวอร์ชันต่ำกว่านั้นอยู่ ก็ขอแสดงความเสียใจด้วย

รูปแบบการทำงานของ CameraX

Use Case Interfacing

CameraX ออกแบบการทำงานออกมาให้อยู่ในรูปแบบของ Use Case ซึ่งเป็น Abstraction Interface เพื่อให้นักพัฒนากำหนดการทำงานของ CameraX ได้ตามที่ต้องการ

โดยใน CameraX ได้เตรียม Use Case ที่สำคัญๆต่อการใช้งานพื้นฐานไว้ให้แล้วดังนี้

  • Preview — สำหรับการแสดงภาพจาก View Finder ของกล้อง
  • Image Capture — สำหรับการบันทึกภาพนิ่งจากกล้อง
  • Video Capture — สำหรับการบันทึกภาพวีดีโอจากกล้อง
  • Image Analysis — สำหรับการวิเคราะห์ข้อมูลภาพจากกล้อง

ในแต่ละ Use Case ก็จะมีสิ่งที่เรียกว่า Configuration Option เพื่อตั้งค่าการทำงานในแต่ละ Use Case แยกกัน เช่น Preview ก็จะมีให้กำหนดค่าต่างๆที่เกี่ยวกับการแสดงภาพจากกล้อง ในขณะที่ Image Capture จะเป็นการกำหนดค่าสำหรับภาพที่จะถ่ายออกมา เป็นต้น ทำให้แต่ละ Use Case สามารถทำงานแยกกันได้อย่างอิสระ

ซึ่งนักพัฒนาสามารถหยิบ Use Case อันไหนก็ได้มาผสมผสานให้เป็นการทำงานแบบที่ต้องการได้

Lifecycle Observing

นักพัฒนาสามารถใช้งาน CameraX ด้วยการผูกกับ Lifecycle ของ Activity หรือ Fragment ได้เลย แล้ว CameraX จะจัดการกับการทำงานของตัวเองให้เหมาะสมกับ Lifecycle แบบอัตโนมัติ โดยใช้ความสามารถใน Android Architecture Components นั่นเอง

และถ้ายังไม่ถูกใจ ก็สามารถ Custom การทำงานของ CameraX ให้ตรงกับ Lifecycle ที่ต้องการได้เหมือนกัน

การแบ่ง Dependency ของ CameraX

เนื่องจากการใช้งานกล้องนั้นมีหลากหลายรูปแบบ ขึ้นอยู่กับนักพัฒนาที่นำไปใช้งาน ดังนั้น CameraX จึงแบ่ง Dependency ออกเป็นหลายตัวเพื่อให้นักพัฒนาเลือกไปใช้เองตามใจชอบ โดยในตอนนี้แบ่งออกมาเป็น Dependency ทั้งหมด 4 ตัวด้วยกัน ดังนี้

// Dependency หลักของ CameraX
implementation "androidx.camera:camera-camera2:<latest_version>"

// สำหรับใช้งาน Lifecycle กับ CameraX
implementation "androidx.camera:camera-lifecycle:<latest_version>"

// สำหรับใช้งาน Camera View ของ CameraX
implementation "androidx.camera:camera-view:<latest_version>"

// สำหรับใช้งาน Camera Extension ของ CameraX
implementation "androidx.camera:camera-extensions:<latest_version>"

และที่ขาดไปไม่ได้เลย ก็คือโปรเจคที่เรียกใช้ CameraX จะต้องเปิดใช้งาน Java 8 Compatibility ด้วยนะ

// build.gradle (module: app)
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

ยุคนี้ต้องหันมาใช้ CameraX แล้วล่ะ

สำหรับแอปที่จำเป็นต้องเขียนคำสั่งเรียกใช้งานกล้องจากในแอปเอง การใช้ CameraX ก็เป็นทางเลือกที่ดีกว่า Camera API v2 อย่างแน่นอน จากความพยายามของทีมพัฒนา CameraX ที่ทำงานร่วมกับอุปกรณ์แอนดรอยด์ยี่ห้อต่างๆ รวมไปถึงการทดสอบในการใช้งานจริง จึงทำให้ในตอนนี้ CameraX มีความสมบูรณ์และพร้อมใช้งานแล้ว (ทีม CameraX เป็นคนบอกเองเลย) ถึงแม้ว่าจะยังเป็น Beta ก็ตาม

เริ่มรู้สึกว่าอยากใช้ CameraX แล้วใช่มั้ยล่ะ? ถ้าอยากรู้ว่าใช้งานยังไง ง่ายแค่ไหน ก็ต้องติดตามอ่านในบทความหน้าแล้วล่ะ