You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:39:03