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
相关产品推荐
相关产品推荐

