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