Android 相机系统

简介

Android 相机系统是 Android 操作系统的一部分,它提供了一套开发者接口,用于访问设备的相机功能。开发者可以使用这些接口来获取图像数据、控制摄像头参数、实现拍照和录像等功能。

相机系统是 Android 平台上的一个重要组件,它为开发者提供了灵活和强大的功能,帮助他们创建各种类型的相机应用。无论是简单的拍照应用还是高级的图像处理应用,都可以使用 Android 相机系统轻松实现。

相机 API

Android 相机系统提供了一系列的 API 接口,用于与相机进行交互。其中最重要的接口是 Camera 类和 Camera2 类。

Camera 类

Camera 类是 Android 相机系统中最早引入的接口,它提供了对相机的基本控制功能。通过 Camera 类,开发者可以实现相机预览、拍照和录像等功能。

以下是一个使用 Camera 类实现相机预览功能的示例代码:

import android.hardware.Camera;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
    private Camera mCamera;
    private SurfaceHolder mHolder;

    public CameraPreview(Context context) {
        super(context);
        mHolder = getHolder();
        mHolder.addCallback(this);
    }

    public void surfaceCreated(SurfaceHolder holder) {
        mCamera = Camera.open();
        try {
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
        } catch (IOException e) {
            Log.d(TAG, "Error setting camera preview: " + e.getMessage());
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        if (mHolder.getSurface() == null) {
            return;
        }
        try {
            mCamera.stopPreview();
        } catch (Exception e) {
            Log.d(TAG, "Error stopping camera preview: " + e.getMessage());
        }
        try {
            mCamera.setPreviewDisplay(mHolder);
            mCamera.startPreview();
        } catch (Exception e) {
            Log.d(TAG, "Error starting camera preview: " + e.getMessage());
        }
    }
}

这段代码创建了一个 SurfaceView 的子类 CameraPreview,用于显示相机预览。在 surfaceCreated 方法中,我们打开相机并将预览显示在 SurfaceHolder 上。在 surfaceDestroyed 方法中,我们释放相机资源。在 surfaceChanged 方法中,我们更新相机预览的大小和格式。

Camera2 类

Camera2 类是 Android 相机系统中引入的新接口,它提供了更强大和灵活的功能。相对于 Camera 类,Camera2 类更加适合开发高级的相机应用。

以下是一个使用 Camera2 类实现拍照功能的示例代码:

import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.CaptureResult;
import android.hardware.camera2.TotalCaptureResult;
import android.hardware.camera2.params.OutputConfiguration;
import android.hardware.camera2.params.SessionConfiguration;
import android.media.Image;
import android.media.ImageReader;
import android.os.Handler;
import android.os.HandlerThread;
import android.util.Log;
import android.util.Size;
import android.view.Surface;
import androidx.annotation.NonNull;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Arrays;

public class Camera2Capture {
    private static final String TAG = "Camera2Capture";
    private CameraDevice mCameraDevice;
    private CameraCaptureSession mCaptureSession;
    private ImageReader mImageReader;
    private HandlerThread mBackgroundThread;
    private Handler mBackgroundHandler;

    private CameraDevice.StateCallback mCameraStateCallback = new CameraDevice.StateCallback() {
        @Override
        public void onOpened(@NonNull CameraDevice cameraDevice) {
            mCameraDevice = cameraDevice;
            createCaptureSession();
        }

        @Override
        public void onDisconnected(@NonNull CameraDevice cameraDevice) {
            cameraDevice.close();
            mCameraDevice = null;
        }

        @Override
        public void onError(@NonNull CameraDevice cameraDevice, int error) {
            cameraDevice.close();
            mCameraDevice = null;
        }
    };

    private ImageReader.OnImageAvailableListener