android camera2开发异常,不能拍照. maxImages (2) has already been acquired, call #close before acquiri

android相机开发Camera2不能拍照超过2张,提示:
java.lang.IllegalStateException: maxImages (1) has already been acquired, call #close before acquiring more.

ImageReader.setOnImageAvailableListener(reader -> {
	// 拿到拍照的数据
	Image image = reader.acquireNextImage();
	// 需要在这个事件监听里面调用close要不然会报上面的错误
	 image.close();
});

也可以在保存后再关闭.

### 使用Camera2 API实现在Android平台的人脸检测 在Android平台上使用Camera2 API进行人脸检测涉及多个方面的工作,包括初始化Camera设备、配置捕获请求以及设置面部侦测监听器等。下面给出一段基于Camera2 API实现人脸检测的基础代码框架。 #### 初始化Camera并开启预览 为了启动摄像头并显示实时画面,在`onCreate()`方法里完成必要的组件绑定工作后,调用自定义函数`openCamera()`来打开指定ID的摄像机实例,并通过创建`ImageReader`对象用于接收来自相机的数据流以便后续处理。 ```java private void openCamera() { CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); try { String cameraId = manager.getCameraIdList()[0]; // 默认选择第一个可用的后置摄像头 CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); Size[] outputSizes = map.getOutputSizes(SurfaceHolder.class); ImageReader reader = ImageReader.newInstance(width, height, format, maxImages); List<Surface> outputSurfaces = new ArrayList<>(2); outputSurfaces.add(reader.getSurface()); outputSurfaces.add(new Surface(textureView.getSurfaceTexture())); CaptureRequest.Builder previewBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); previewBuilder.addTarget(outputSurfaces.get(1)); cameraDevice.createCaptureSession(outputSurfaces, new CameraCaptureSession.StateCallback(){ @Override public void onConfigured(@NonNull CameraCaptureSession session){ updatePreview(session); } private void updatePreview(CameraCaptureSession session){ if(null==cameraDevice){ Log.e(TAG,"updatePreview error, return"); } captureSession=session; try{ previewBuilder.set(CaptureRequest.CONTROL_MODE,CameraMetadata.CONTROL_MODE_AUTO); HandlerThread thread=new HandlerThread("CameraPreview"); thread.start(); Handler backgroundHandler=new Handler(thread.getLooper()); session.setRepeatingRequest(previewBuilder.build(),null,backgroundHandler); }catch(Exception e){ e.printStackTrace(); } } ... }, null); } catch (Exception e) { e.printStackTrace(); } } ``` #### 设置面部检测模式 一旦成功建立了捕捉会话,则可以通过修改构建中的`CaptureRequest`属性来激活脸部识别特性。这通常涉及到调整诸如`STATISTICS_FACE_DETECT_MODE`这样的参数至更高级别的选项如`FACE_DETECTION_FULL`以启用完整的面部特征分析能力[^4]。 ```java previewBuilder.set(CaptureRequest.STATISTICS_FACE_DETECT_MODE, CameraMetadata.STATISTICS_FACE_DETECT_MODE_FULL); ``` #### 注册面部检测事件处理器 最后一步是注册一个实现了`FaceDetectionListener`接口的对象作为回调机制的一部分,每当发现新的面孔时就会触发相应的通知逻辑。这里假设存在名为`mOnFaceDetected`的方法负责具体响应动作[^2]。 ```java cameraDevice.setFaceDetectionListener(mOnFaceDetected); // 或者当采用CameraCaptureSession的方式管理session时, // 可以这样添加到repeating request中: previewBuilder.set(CaptureRequest.STATISTICS_FACE_RECOGNITION_LISTENER, mOnFaceDetected); ``` 以上即是在Android应用内借助Camera2 API执行基本人脸检测操作的大致过程概述。值得注意的是实际项目开发过程中还需要考虑权限申请、异常情况处理等诸多细节问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值