Android 8.1.0(2.8.4版)M3设备Camera.release()无法释放相机
我开发了一款自定义相机应用,多数设备运行正常,但近期发现部分设备存在异常。在相机Activity结束时,我会执行相机释放与预览停止操作。经多设备多Android版本测试发现:当设备build版本高于2.6.x时,camera.release()方法无法正常释放相机;而在build版本≤2.6.x的设备上,以下基于已废弃Camera.Hardware库编写的代码可正常工作:
private void stopPreview () { if ( camera != null) { if (camera != null) { camera.release(); } this.inPreview = false; cameraReleased = true; onAutofocus = false; } }
恳请协助分析该特定版本中camera.release()失效的原因。
针对你碰到的camera.release()在高版本设备失效的问题,结合旧Camera API特性和高版本Android的资源管理逻辑,主要原因如下:
未先停止预览就释放相机
你的代码直接调用camera.release(),没有先执行camera.stopPreview()。低版本Android对相机资源管理较为宽松,允许跳过停止预览步骤直接释放;但高版本系统对相机生命周期的管控更严格,必须先停止预览、解除相机与Surface的绑定,才能彻底释放底层硬件资源,否则release()调用会被系统忽略或执行不彻底。废弃API的兼容性差异
你使用的Camera.Hardware属于旧版已废弃的相机API,高版本Android对废弃API的底层实现做了调整,旧API的调用逻辑不再适配新的硬件抽象层(HAL),直接调用release()可能无法正确触发底层资源的释放流程。异步任务占用相机资源
代码中存在onAutofocus标志位,说明你的应用包含自动对焦操作。如果在调用release()时,自动对焦的异步任务仍在执行,高版本系统会因为相机资源被异步任务占用而拒绝释放请求;低版本系统则可能强制释放资源,不会检查异步任务的执行状态。状态标志位更新时机错误
你在camera.release()之后才设置inPreview、cameraReleased等标志位,但高版本系统中release()可能因资源占用而执行失败,此时标志位的更新会与相机实际状态不符,进一步导致后续逻辑误判相机已释放。
内容的提问来源于stack exchange,提问作者azaLiza

