Camera trong Android (Phần 1)

1. Mở đầu

Ứng dụng của camera trong thời đại công nghệ như hiện nay rất phong phú và đa dạng. Từ những ứng dụng chuyên về chụp ảnh để selfie, những ứng dụng mạng xã hội sử dụng camera để livestream cho tới những ứng dụng về thanh toán dùng để quét mã vạch. Có thể thấy camera được tích hợp vào trong rất nhiều các app giúp cho người sử dụng thấy dễ dàng trong việc sử dụng app hơn. Vì vậy, bài viết này sẽ giới thiệu về cách tích hợp camera vào trong ứng dụng android.

2. Các cách tích hợp camera trong Android

Tuỳ vào nhu cầu, đặc thù của từng ứng dụng mà sử dụng camera với các mục đích khác nhau. Tuy nhiên các bước tổng quát để tích hợp camera trong Android thì giống nhau:

  1. Yêu cầu quyền truy cập camera: Kiểm tra xem thiết bị có camera hay không? Nếu có thì có được người sử dụng cho phép hay không?
  2. Chụp ảnh: Chụp ảnh bằng một cách nào đó sao cho sau bước này ta thu được dữ liệu ảnh
  3. Lưu & hiển thị: Việc chỉ xử lý dữ liệu và lấy ra được ảnh là chưa đủ. Chúng ta còn phải lưu ảnh lại hoặc hiển thị để người dùng có thể thấy được là chúng ta đã chụp được ảnh thành công.

Về mặt kỹ thuật thì có thể sử dụng camera theo 2 cách sau:

  • Sử dụng camera có sẵn trong điện thoại (Camera Intent)
  • Sử dụng camera Interface để tuỳ biến và xử lý sâu hơn theo các nhu cầu phức tạp (Camera API)

Sau đây chúng ta sẽ đi sâu hơn để tìm hiểu về 2 cách đã nêu trên.

3. Sử dụng Camera Intent

Chúng ta có thể tạo ra nó bằng cách gọi đến Intent sau:

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, REQUEST_IMAGE_CAPTURE);

Hầu hết các phần cứng đều yêu cầu quyền truy cập khi chúng ta muốn sử dụng nó, vậy nên việc sử dụng camera cũng cần phải yêu cầu quyền truy cập thông qua file Manifest.xml:

<uses-feature 
    android:name="android.hardware.camera"
    android:required="true" />

Tuy nhiên, với các loại máy từ API 23 trở đi thì quyền truy cập camera cần phải gọi bằng Runtime Permission

//Check camera permission
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
                == PackageManager.PERMISSION_GRANTED) {
            //TODO: Do somethings
        } else {
            //Request camera permission
            ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.CAMERA },
                    Constants.RequestCode.REQUEST_CAMERA_PERMISSION);
        }

Vậy là công việc chụp ảnh đã được chuyển giao cho cameraIntent. Tiếp theo, chúng ta chỉ cần xử lý dữ liệu trả về từ camera là xong:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        Bundle extras = data.getExtras();
        Bitmap imageBitmap = (Bitmap) extras.get("data");
        //TODO: Do somethings with bitmap
    }
}

4. Sử dụng Camera API

Đi đôi với việc xử lý các yêu cầu phức tạp trong sử dụng camera thì việc khởi tạo, xử lý trong coding cũng loằng ngoằng hơn việc dùng Camera Intent. Với đặc thù là sự phân mảnh trong Android nên việc các API bị thay đổi, cập nhật cũng không tránh khỏi do phần cứng của các thiết bị được nâng cấp theo thời gian rất nhanh. Các tính năng mới của phần cứng tăng lên, đòi hỏi phải cập nhật API để có thể tận dụng hết được các tính năng đó. Và camera cũng không phải là một ngoại lệ. Theo đó, từ phiên bản dưới API 21 thì vẫn dùng API camera cũ, còn từ API 21 trở đi thì đã chuyển sang dùng camera2. Tuy nhiên, các bước cơ bản để xử lý camera thông qua API là giống nhau:

  1. Yêu cầu quyền truy cập camera: Kiểm tra xem thiết bị có camera hay không và yêu cầu truy cập.
  2. Tạo ra thành phần hiển thị những gì camera thu được: Tạo ra các view kế thừa từ SurfaceView và giao diện để người dùng có thể tương tác với camera.
  3. Thêm/cài đặt các sự kiện để lắng nghe khi chụp ảnh: Bắt được các hành động của người dùng để từ đó xử lý camera theo đúng yêu cầu.
  4. Chụp ảnh và lưu ảnh: Thực hiện chụp ảnh và lưu ảnh hoặc hiển thị cho người dùng
  5. Giải phóng camera: Sau khi làm việc xong, chúng ta trả lại camera cho hệ thống để các ứng dụng khác có thể sử dụng được camera. Việc tích hợp Camera API vào ứng dụng sẽ có rất nhiều điểm khác biệt giữa camera và camera2 nên trong phần này tôi chỉ đưa ra các bước cơ bản như trên, phần sau sẽ đi chi tiết hơn vào cách tích hợp camera và camera2 và cách để có thể sử dụng camera được trên nhiều thiết bị với các phiên bản API các nhau . Từ đó, có thể đưa ra được các điểm khác biệt trong 2 API này.