运行Marshmallow系统的Astro Tab A10相机无法正常释放问题求助
解决Marshmallow设备上相机无法正常释放的问题
我看到你在运行Marshmallow系统的Astro Tab A10设备上遇到了相机无法正常释放的问题,结合你贴出的代码片段,咱们来一步步排查和修复这个问题:
现有代码的核心问题
你的surfaceCreated只处理了相机初始化,但缺少对应的资源释放逻辑;另外resetCamera方法不完整,没有同步处理相机和MediaRecorder的资源释放——在Marshmallow系统中,资源管理和权限校验更严格,遗漏释放步骤很容易导致相机被后台占用,无法再次打开。
具体修复方案
1. 新增相机与MediaRecorder的专用释放方法
先封装两个核心释放方法,确保资源能被彻底清理:
// 释放相机资源 private void releaseCamera() { if (mCamera != null) { // 先停止预览,避免资源占用 mCamera.stopPreview(); // 释放相机核心资源 mCamera.release(); mCamera = null; } } // 释放MediaRecorder资源 private void releaseMediaRecorder() { if (mMediaRecorder != null) { mMediaRecorder.reset(); mMediaRecorder.release(); mMediaRecorder = null; } }
2. 完善resetCamera方法的完整性
补全你的resetCamera逻辑,确保录制停止后同步释放所有相关资源:
private void resetCamera() { if (!videoReset) { if (videoStarted && !videoStopped) { try { mMediaRecorder.stop(); } catch (RuntimeException e) { // 捕获录制未正常启动的异常,避免崩溃 e.printStackTrace(); } // 释放MediaRecorder releaseMediaRecorder(); } // 同步释放相机 releaseCamera(); // 重置状态标记 videoReset = true; videoStarted = false; videoStopped = true; // 补全MediaScanner的完整逻辑 MediaScannerConnection.scanFile(TherapistActivity.this, new String[]{videoFile.getAbsolutePath()}, null, (path, uri) -> { // 可在这里处理扫描完成后的回调逻辑 }); } }
3. 在生命周期节点强制调用释放逻辑
必须在surfaceDestroyed和Activity销毁时执行释放,避免后台残留资源:
@Override public void surfaceDestroyed(SurfaceHolder holder) { releaseCamera(); releaseMediaRecorder(); } @Override protected void onDestroy() { super.onDestroy(); // 双重保险,确保Activity销毁时资源被释放 releaseCamera(); releaseMediaRecorder(); }
4. 适配Marshmallow的动态权限校验
Marshmallow要求动态申请相机和存储权限,权限缺失也可能导致相机资源无法正常释放,记得在初始化相机前做权限检查:
private static final int CAMERA_PERMISSION_CODE = 1001; // 检查相机与存储权限 private boolean checkCameraPermissions() { int cameraPerm = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA); int storagePerm = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); return cameraPerm == PackageManager.PERMISSION_GRANTED && storagePerm == PackageManager.PERMISSION_GRANTED; } // 在初始化相机前调用权限检查 if (!checkCameraPermissions()) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, CAMERA_PERMISSION_CODE); return; } // 权限通过后再执行相机初始化逻辑
这些改动应该能解决你设备上的相机释放问题,核心是确保每一个初始化的资源(Camera、MediaRecorder)都有对应的释放逻辑,并且在合适的生命周期节点触发。如果还有问题,可以检查是否有其他代码持有相机的引用,导致资源无法被回收。
内容的提问来源于stack exchange,提问作者Pink Jazz
相关产品推荐
相关产品推荐

