Camera2 - 在某些设备上不时出现“捕获会话配置失败”和“Surface 被放弃”

问题描述

我有一个录制视频的应用,目前安装量约为 90K(225K 下载),Crashlytics 统计数据似乎不错 - 无崩溃用户率为 99.5%,Google Play 评分也不错 - 4.5

但是对于我的一些用户来说,camera2 仍然会发生下一个错误(这种情况现在可能会发生一次或几次,所以不经常发生,但仍然不时发生):

Capture session configuration failed

在下一个设备上

enter image description here

Camera2 startPreview java.lang.IllegalArgumentException: Surface was abandoned
    at android.hardware.camera2.utils.SurfaceUtils.getSurfaceSize(SurfaceUtils.java:89)
    at android.hardware.camera2.params.OutputConfiguration.<init>(OutputConfiguration.java:260)
    at android.hardware.camera2.params.OutputConfiguration.<init>(OutputConfiguration.java:145)

在下一个设备上

enter image description here

可能的原因(基于用户的一些电子邮件回复):

  • 当他们锁定设备屏幕时
  • 来电

App 可以在后台继续录制视频(前台服务)。在 Activity onStop() 上,它开始预览一个表面(从 SurfaceTexture 创建,用于使用 OpenGL 处理进行视频录制)而不是两个:

val surfaces = ArrayList<Surface>().apply {
    holder?.let { add(it.surface) } // non-nullable when activity is started (foreground only)
    add(it.cameraSurface) // always,for video recording (background and foreground)
}

此逻辑 100% 稳定,否则无法在大多数设备上运行。

而且我无法在自己的设备上重现这些问题。

经过测试,在我的设备上整晚关闭显示屏的情况下进行后台录音,没有错误,通过来电测试,仍然可以正常工作,正如我之前所说,它只发生在某些用户身上,而不是很多用户身上。

如果满足以下条件,我的应用还会为设备使用旧版/弃用的 Camera API:

val level = cameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)
val isLegacy = level == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY

对于所有其他设备,它使用 camera2(具有 LIMITED、FULL 级别等)api

我经常从使用 camera2 API 的设备的用户那里收到错误消息。

似乎已弃用的 Camera API 更稳定

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...