camera api2拍照步骤与完整demo
时间: 2023-07-28 19:10:19 浏览: 85
以下是使用Camera API2拍照的基本步骤:
1. 获取相机设备:使用CameraManager类获取相机设备列表,并选择需要的相机设备。
```
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
String cameraId = manager.getCameraIdList()[0];
CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
```
2. 初始化相机设备:打开相机设备,设置相机参数,并创建一个CameraCaptureSession用于捕获图像。
```
manager.openCamera(cameraId, new CameraDevice.StateCallback() {
@Override
public void onOpened(@NonNull CameraDevice camera) {
mCameraDevice = camera;
try {
//设置相机参数
mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
mPreviewBuilder.addTarget(mPreviewSurface);
//创建一个CameraCaptureSession用于捕获图像
mCameraDevice.createCaptureSession(Arrays.asList(mPreviewSurface, mImageReader.getSurface()), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
mCaptureSession = session;
//开始预览
mCaptureSession.setRepeatingRequest(mPreviewBuilder.build(), null, null);
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
Log.e(TAG, "Failed to configure camera capture session.");
}
}, null);
} catch (CameraAccessException e) {
Log.e(TAG, "Failed to initialize camera device.", e);
}
}
@Override
public void onDisconnected(@NonNull CameraDevice camera) {
Log.e(TAG, "Camera device unexpectedly disconnected.");
}
@Override
public void onError(@NonNull CameraDevice camera, int error) {
Log.e(TAG, "Camera device error: " + error);
}
}, null);
```
3. 拍照:创建一个CaptureRequest.Builder用于设置拍照参数,然后通过CameraCaptureSession.capture()方法捕获图片。
```
CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureBuilder.addTarget(mImageReader.getSurface());
captureBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
mCaptureSession.capture(captureBuilder.build(), null, null);
```
4. 关闭相机:拍照完成后,需要关闭相机设备和CameraCaptureSession。
```
mCameraDevice.close();
mCaptureSession.close();
```
下面是一个完整的Camera API2拍照示例代码:
```
public class CameraActivity extends AppCompatActivity {
private static final String TAG = "CameraActivity";
private TextureView mPreviewView;
private ImageReader mImageReader;
private CameraDevice mCameraDevice;
private CameraCaptureSession mCaptureSession;
private CaptureRequest.Builder mPreviewBuilder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
mPreviewView = findViewById(R.id.preview_view);
//创建一个ImageReader对象用于捕获拍照图片
mImageReader = ImageReader.newInstance(1080, 1920, ImageFormat.JPEG, 1);
mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
//拍照完成后处理图片
Image image = reader.acquireLatestImage();
//TODO:处理图片
image.close();
}
}, null);
}
@Override
protected void onResume() {
super.onResume();
//打开相机设备
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
String cameraId = manager.getCameraIdList()[0];
CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
try {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
return;
}
manager.openCamera(cameraId, new CameraDevice.StateCallback() {
@Override
public void onOpened(@NonNull CameraDevice camera) {
mCameraDevice = camera;
try {
//设置相机参数
mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
mPreviewBuilder.addTarget(mPreviewView.getSurfaceTexture());
//创建一个CameraCaptureSession用于捕获图像
mCameraDevice.createCaptureSession(Arrays.asList(mPreviewView.getSurfaceTexture(), mImageReader.getSurface()), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
mCaptureSession = session;
//开始预览
mCaptureSession.setRepeatingRequest(mPreviewBuilder.build(), null, null);
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
Log.e(TAG, "Failed to configure camera capture session.");
}
}, null);
} catch (CameraAccessException e) {
Log.e(TAG, "Failed to initialize camera device.", e);
}
}
@Override
public void onDisconnected(@NonNull CameraDevice camera) {
Log.e(TAG, "Camera device unexpectedly disconnected.");
}
@Override
public void onError(@NonNull CameraDevice camera, int error) {
Log.e(TAG, "Camera device error: " + error);
}
}, null);
} catch (CameraAccessException e) {
Log.e(TAG, "Failed to open camera device.", e);
}
}
@Override
protected void onPause() {
super.onPause();
//关闭相机设备和CameraCaptureSession
if (mCameraDevice != null) {
mCameraDevice.close();
}
if (mCaptureSession != null) {
mCaptureSession.close();
}
}
}
```
希望这个示例代码对你有帮助。