android - Android:(Camera2)相机从活动返回后不再存在异常
问题描述
我一直在练习使用Camera2
API 在 android 上设置相机并SurfaceView
在屏幕上显示预览。但是,在从子活动返回后尝试创建一个异常时抛出异常CameraCaptureSession
,该子活动的目的只是为相机选择一个配置。
抛出的异常是:
E/CameraCaptureSession: Session 0: Failed to create capture session; configuration failed
android.hardware.camera2.CameraAccessException: CAMERA_DISCONNECTED (2): createStream:632: Camera device no longer alive
从相机设备创建捕获会话时,函数会引发此异常,如下所示:
private void startPreview() {
try {
final Surface previewSurface = this.cameraSurfaceView.getHolder().getSurface();
List<Surface> targetSurfaces = Collections.singletonList(previewSurface);
final CaptureRequest.Builder captureRequestBuilder = this.cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
captureRequestBuilder.addTarget(previewSurface);
this.cameraDevice.createCaptureSession(targetSurfaces, new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
try {
if (cameraDevice == null) {
return;
}
captureSession = session;
captureRequest = captureRequestBuilder.build();
session.setRepeatingRequest(captureRequest, null, cameraHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
}
}, this.cameraHandler);
} catch (CameraAccessException e) {
final String message = "Unable to start preview";
Log.e(TAG, message, e);
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
}
此异常有一个问题,因此应用程序不会崩溃,但是即使出现此异常,似乎上一个活动的新设置仍在工作(目前它只是更改相机 ID)。
起初我认为这可能是因为当新活动开始时我没有关闭资源所以这不会发生,所以我为此创建的函数如下所示:
@Override
protected void onStop() {
super.onStop();
if (this.captureSession != null) {
try {
this.captureSession.stopRepeating();
this.captureSession.close();
this.captureSession = null;
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
if (this.cameraDevice != null) {
this.cameraDevice.close();
this.cameraDevice = null;
}
this.cameraSurfaceView.getHolder()
.getSurface()
.release();
}
这就是SurfaceView
管理的方式
@Override
protected void onInitialize() {
this.cameraSurfaceView.getHolder()
.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.d(TAG, "Camera surface view created");
initializeCamera();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
});
}
但即使这样也不能解决错误。我担心这个异常,我想修复它。我只是不知道此时还能做什么。SurfaceView
执行相机打开的代码来自
解决方案
推荐阅读
- angular - 如何根据 typescript/angular 数组中的属性值对对象进行子集化?
- c# - 解密 AES 字符串未按预期工作
- python - FileNotFoundError - 从 WindowsPath 对象打开图像时遇到问题
- spring - Spring:如何访问位于 jar 之外的 txt 文件?
- .htaccess - .htaccess 在 URLS 末尾强制使用斜杠
- python - 如何创建带有事件的键盘侦听器?(Python)
- google-sheets - 如何从网络表单中的 Google 表格数据生成填充的 PDF?
- react-native - React Native 使用 useSelector 保持滚动视图位置
- java - 使@GeneratedValue 开始一个具有特定值的序列
- angular - 用 jest 测试角度组件会给出 resolveComponentResources