Hỗ trợ camera trên nhiều kiểu dáng

Ứng dụng Android chạy trên nhiều kiểu dáng hơn là chỉ điện thoại ở chế độ dọc. Với sự ra đời của tính năng cửa sổ kiểu máy tính, màn hình được kết nối và thiết bị có thể gập lại, ứng dụng camera của bạn phải thích ứng với kích thước cửa sổ động, tỷ lệ khung hình khác nhau và phần cứng bên ngoài.

Hình 1. Ví dụ về các ứng dụng camera trên nhiều màn hình.

Lý do logic của điện thoại bị hỏng

Các ứng dụng camera thường đưa ra những giả định gây ra lỗi nghiêm trọng trên môi trường nhiều kiểu dáng.

Hướng tự nhiên

  • Giả định: Hướng tự nhiên ROTATION_0 của thiết bị luôn là hướng dọc
  • Thực tế: Trên máy tính bảng, màn hình trong của một số thiết bị có thể gập lại và màn hình máy tính, ROTATION_0 thường là hướng ngang
  • Kết quả: Bản xem trước xoay sai 90 độ
Hình 2. Kính ngắm camera trước và sau khi áp dụng chế độ xoay chính xác.

Căn chỉnh cảm biến

  • Giả định: Cạnh dài của cảm biến camera căn chỉnh với cạnh dài của màn hình
  • Thực tế: Cửa sổ có thể đổi kích thước có thể là hình vuông hoặc hình ngang trong khi cảm biến vẫn cố định (thường là 4:3)
  • Kết quả: Hình ảnh bị kéo giãn hoặc bị biến dạng
Hình 3. Kính ngắm camera trước và sau khi áp dụng hệ số tỷ lệ chính xác.

Mật độ và kích thước màn hình

  • Giả định: Mật độ và kích thước màn hình không thay đổi trong thời gian chạy
  • Thực tế: Trong môi trường máy tính, người dùng tự do đổi kích thước cửa sổ
  • Kết quả: Việc khởi động lại phiên camera trên mỗi sự kiện kéo sẽ làm gián đoạn trải nghiệm người dùng và có thể gây ra sự cố

Giải pháp 1: Sử dụng ý định hệ thống

Nếu ứng dụng của bạn cần chụp ảnh hoặc quay video nhưng không yêu cầu giao diện camera tuỳ chỉnh chuyên dụng, thì cách tốt nhất để xử lý các kiểu dáng khác nhau là khởi chạy camera hệ thống được cài đặt sẵn của thiết bị (xem Ý định camera)

Việc sử dụng ý định hệ thống sẽ uỷ quyền toàn bộ trải nghiệm chụp cho ứng dụng camera do nhà sản xuất thiết bị gốc (OEM) phát triển. Điều này giúp thuê ngoài hiệu quả sự phức tạp của việc hỗ trợ kiểu dáng, bao gồm:

  • Hỗ trợ đổi kích thước và xoay tích hợp – Ứng dụng camera mặc định trên thiết bị có thể gập lại hoặc máy tính bảng được nhà sản xuất thiết kế rõ ràng để xử lý hình học của thiết bị cụ thể đó. Ứng dụng được thiết kế để hoạt động đúng cách khi thiết bị được mở ra, xoay hoặc chuyển sang chế độ nhiều cửa sổ.
  • Quyền truy cập vào các tính năng phần cứng nâng cao – Các ứng dụng camera OEM có quyền truy cập độc quyền vào các thuật toán được điều chỉnh bằng phần cứng (chế độ ban đêm, HDR, chuyển đổi ống kính cụ thể) mà khó hoặc không thể sao chép theo cách thủ công.

Giải pháp 2: Sử dụng Jetpack CameraX

CameraX là thư viện Jetpack, được thiết kế để giúp việc phát triển ứng dụng camera trở nên dễ dàng hơn. CameraX nhận biết được vòng đời và hướng đến bề mặt. Không giống như Camera2, yêu cầu tính toán lại hướng cảm biến và kích thước bề mặt theo cách thủ công mỗi khi thiết bị gập, xoay hoặc đổi kích thước, CameraX sẽ tự động xử lý việc định cấu hình lại các phiên camera trong quá trình đổi kích thước nhiều cửa sổ hoặc khi một ứng dụng chuyển sang màn hình được kết nối, đảm bảo luồng xem trước thích ứng mà không bị kết xuất gián đoạn hoặc kéo giãn.

Các thành phần như PreviewView quản lý một cách thông minh tỷ lệ khung hình và các loại tỷ lệ trên nhiều trạng thái, chẳng hạn như thiết bị có thể gập lại chuyển đổi từ màn hình ngoài sang màn hình bên trong, cho phép bạn hỗ trợ nhiều loại phần cứng bằng một cách triển khai nhất quán duy nhất thay vì một tập hợp phức tạp các trường hợp đặc biệt dành riêng cho thiết bị.

Soạn thư

Với Jetpack Compose, hãy sử dụng androidx.camera:camera-compose thư viện chuyên dụng. Thư viện này cung cấp thành phần kết hợp CameraXViewfinder, được thiết kế đặc biệt để xử lý hình học phức tạp của việc đổi kích thước, xoay và tỷ lệ khung hình trong vòng đời Compose.

Thành phần CameraXViewfinder loại bỏ các nguồn lỗi phổ biến nhất trong ứng dụng camera:

  • Tự động chuyển đổi toạ độ – Một trong những phần khó nhất khi xây dựng ứng dụng camera là ánh xạ thao tác nhấn của người dùng (toạ độ x, y trên màn hình) sang hệ toạ độ của cảm biến camera (0-1, 0-1 xoay) để lấy nét và đo sáng. CameraXViewfinder cung cấp CoordinateTransformer tự động xử lý phép toán, ngay cả khi cửa sổ được đổi kích thước hoặc thiết bị được gập lại.
  • Hành vi bố cục chính xác – Không giống như SurfaceView hoặc TextureView, CameraXViewfinder hoạt động chính xác với thứ tự z của Compose. Bạn có thể phủ các phần tử trên giao diện người dùng (vòng lấy nét, chế độ điều khiển) hoặc áp dụng các thành phần sửa đổi (góc bo tròn, hình động) mà không cần hiển thị cấu phần phần mềm.
  • Đổi kích thước và tỷ lệ khung hình: CameraXViewfinder xử lý nội bộ logic cắt xén ở giữa so với vừa khít ở giữa, đảm bảo bản xem trước không bị kéo giãn khi cửa sổ ứng dụng được đổi kích thước thành tỷ lệ khung hình không chuẩn (ví dụ: chế độ chia đôi màn hình hoặc chế độ cửa sổ trên máy tính).

Số lượt xem

Trên các ứng dụng dựa trên khung hiển thị, hãy sử dụng PreviewView hoặc ViewFinderView. Nếu sử dụng SurfaceView hoặc TextureView trực tiếp, bạn phải tự tính toán tỷ lệ khung hình và áp dụng ma trận biến đổi chính xác.

Giải pháp 3: Xử lý hướng và đổi kích thước một cách linh hoạt

Khi sử dụng trực tiếp các API nền tảng, hãy lưu ý đến chế độ xoay thiết bị, khởi động lại hoạt động và tỷ lệ khung hình.

Ngừng sử dụng chế độ xoay thiết bị

Đừng chỉ dựa vào Display#getRotation() hoặc hướng cảm biến thực để xác định bố cục của giao diện người dùng.

  • Sử dụng chỉ số cửa sổ – Xác định bố cục (giao diện người dùng ngang so với dọc ) bằng cách so sánh chiều rộng và chiều cao của cửa sổ ứng dụng bằng WindowManager#getCurrentWindowMetrics().
  • Bỏ qua hướng tự nhiên – Ứng dụng của bạn có thể nằm trong một cửa sổ hình dọc trên màn hình ngang. Hướng thiết bị không liên quan đến ranh giới giao diện người dùng.

Tránh tình trạng hoạt động khởi động lại

Hành vi mặc định của Android sẽ huỷ hoạt động của ứng dụng khi có thay đổi về cấu hình changes (như đổi kích thước cửa sổ). Đối với các ứng dụng camera, điều này xuất hiện dưới dạng màn hình nhấp nháy hoặc kết nối bị gián đoạn trong các cuộc gọi video.

  • Cấu hình tệp kê khai – Khai báo các thay đổi về cấu hình trong tệp kê khai để xử lý việc đổi kích thước mà không cần khởi động lại.
  • Cập nhật động – Trong onConfigurationChanged(), hãy cập nhật các tham số bố cục của bản xem trước camera để khớp với kích thước cửa sổ mới.

Tỷ lệ khung hình và cắt xén

Một vấn đề thường gặp trên các thiết bị có thể gập lại và cửa sổ máy tính là kéo giãn bản xem trước, trong đó nguồn cấp dữ liệu từ camera 4:3 bị buộc vào cửa sổ 16:9 hoặc 1:1.

  • Không kéo giãn – Đừng bao giờ buộc bộ đệm camera khớp chính xác với ranh giới khung hiển thị nếu tỷ lệ khung hình của bản xem trước và cửa sổ khác nhau.
  • Cắt xén ở giữa (nên dùng): Điều chỉnh tỷ lệ bản xem trước để lấp đầy kích thước ngắn nhất của cửa sổ và cắt xén phần thừa. Điều này đảm bảo đối tượng vẫn không bị biến dạng và lấp đầy khung hình.
  • Vừa khít ở giữa (lựa chọn thay thế): Nếu việc hiển thị toàn bộ trường nhìn là rất quan trọng (ví dụ: quét tài liệu), hãy tạo hiệu ứng hòm thư cho bản xem trước bên trong cửa sổ.

Phần thưởng: Hỗ trợ trải nghiệm ưu tiên thiết bị có thể gập lại

Thiết bị có thể gập lại không chỉ là điện thoại có thể gập. Chúng cũng cung cấp các trạng thái phần cứng độc đáo có thể cải thiện cơ bản cách người dùng chụp ảnh và quay video. Thay vì coi việc gập là một vấn đề cần giải quyết, hãy sử dụng tính năng này để tạo các tính năng không thể có trên các thiết bị không gập được.

Chế độ mặt bàn (chụp không dùng tay)

Chế độ mặt bàn cho phép người dùng gập thiết bị một nửa và đặt thiết bị trên một bề mặt để thực hiện các cuộc gọi video kéo dài, chụp ảnh tua nhanh thời gian và chụp ảnh ban đêm phơi sáng lâu.

Hình 5. Ứng dụng giao tiếp ở chế độ mặt bàn: kính ngắm camera ở trên cùng của bản lề và các chế độ điều khiển ở dưới cùng.

Chế độ màn hình sau (ảnh chân dung tự chụp chất lượng cao)

  • Trên các thiết bị có thể gập lại, camera sau thường có chất lượng cao hơn camera quay về phía người dùng. Chế độ màn hình sau cho phép người dùng mở thiết bị và xoay thiết bị, sử dụng màn hình ngoài nhỏ làm kính ngắm trực tiếp cho camera sau chính.
  • Chế độ màn hình sau cho phép chụp ảnh chân dung tự chụp 50MP trở lên, chụp ảnh nhóm góc siêu rộng và quay vlog chất lượng cao mà không cần mang theo thiết bị bổ sung.

Chế độ Dual Screen (bản xem trước đối tượng)

  • Chế độ Dual Screen cho phép bạn hiển thị bản xem trước camera trên cả màn hình bên trong và bên ngoài cùng một lúc. Chế độ này rất phù hợp để chụp ảnh người: đối tượng trong ảnh có thể nhìn thấy chính mình trên màn hình ngoài và điều chỉnh tư thế trong khi bạn lấy khung hình trên màn hình bên trong.
  • Không giống như chế độ màn hình sau (di chuyển toàn bộ ứng dụng), chế độ Dual Screen tạo một cửa sổ trình bày thứ hai trên màn hình ngoài.
Hình 5. Ứng dụng camera ở chế độ Dual Screen.