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

Qt/QML Android:相机已检测但ImageCapture提示“Camera is not ready”错误

解决Qt/QML Android中ImageCapture提示“Camera is not ready”的问题

问题核心原因

该错误大多因相机未完成初始化就触发ImageCapture的捕获操作导致,同时Android权限配置、Camera组件状态绑定逻辑也可能引发此问题。

解决方案

1. 等待相机初始化完成后启动捕获Timer

不要直接将Timer的running绑定到cameraDev.enable,改为监听Camera的activeChanged信号,确认相机激活成功后再启动Timer,确保相机设备已就绪。

2. 动态控制Camera激活状态

避免直接设置active: true,需结合cameraDevice有效性与cameraDev.enable状态动态控制,确保仅在相机设备存在且启用时激活相机。

3. 补全Android相机权限配置

在AndroidManifest.xml中添加必要权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

Android 6及以上版本需动态申请权限,确保权限获取后再初始化相机。

4. 优化ImageCapture调用时机

除检查readyForCapture状态,可监听readyForCaptureChanged信号,确保状态就绪后执行捕获。

修改后的代码示例

import QtQuick
import QtQuick.Controls
import QtMultimedia

Item {
    id: cameraController

    property MediaDevices mediaDevices: null
    property ICamera cameraDev: null

    // Timer to capture frames as fast as possible
    Timer {
        id: timer
        interval: 1000.0 / 24.0
        repeat: true
        onTriggered: {
            if (imageCapture.readyForCapture)
                imageCapture.capture();
        }
    }

    CaptureSession {
        id: captureSession

        camera: Camera {
            id: mycameraDevice
            // 动态控制相机激活状态
            active: cameraDev.enable && cameraDevice !== null
            
            cameraDevice: cameraDev.index >= 0 ? mediaDevices.videoInputs[cameraDev.index] : null

            onActiveChanged: {
                // 相机激活成功后启动Timer,未激活则停止
                timer.running = active && cameraDev.enable;
                if (!active) {
                    console.log("Camera failed to activate");
                }
            }

            onErrorOccurred: (error, errorString) => {
                console.log("Camera name", cameraDev.name, "Camera error:", errorString)
            }
        }

        imageCapture: ImageCapture {
            id: imageCapture

            onImageCaptured: (requestId, previewImage) => {
                cameraDev.currentFrame = previewImage
            }

            onErrorOccurred: (id, err, errstr) => {
                console.log("errstr :  ", id, err, errstr)
            }
        }
    }
}

额外注意事项

  • 确保mediaDevices已正确初始化(如通过MediaDevices{}实例赋值),避免videoInputs为空。
  • 相机设备切换时,先停止当前相机再重新初始化,避免状态冲突。

内容的提问来源于stack exchange,提问作者Mohsen Kondori

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 18:43:12