QML Camera not working on Android
-
Hello everyone,
I have a custom qml type defined as:import QtQuick 2.0 import QtMultimedia import QtQrDec import MyDesigns Item { id:root signal gotdata(string data); function stop() { timer.stop(); camera.stop(); startcamera.visible=true; } VideoOutput { id: videoOutput anchors.fill: root } MediaDevices { id: devices } Camera { id: camera active: false cameraDevice: devices.defaultVideoInput onErrorOccurred: (error,errorString)=> { console.log( devices.videoInputs); console.log(errorString) console.log(error) } } Connections { target: QRImageDecoder function onText_changed(boo) { root.gotdata(QRImageDecoder.text) } } CaptureSession { id: capturesession camera: camera videoOutput: videoOutput imageCapture: ImageCapture { id: imageCapture onImageCaptured: { QRImageDecoder.source = imageCapture.preview } } } Timer { id: timer interval: 500; running: false; repeat: true onTriggered: imageCapture.capture() } MyButton { id:startcamera anchors.centerIn: root text:qsTr("ScanQr") onClicked: { camera.start(); timer.start(); startcamera.visible=false; } width:100 height:width*0.5 } }
This work for desktop platforms and show the camera video.
The only problem with desktop applications is this one.I have compiled my app also for android, but when deploying the app from qtCreator to my physical device
qml returns :qml : : [] qml : : Failed to open camera qml : : 1
The devices.videoInputs list is empty and the camera can not be opened. I am using USB debugging to deploy to my physical device.
Also I have check and the AndroidManifest.xml has the camera permission.<?xml version="1.0"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.qtproject.example.nftminter" android:installLocation="auto" android:versionCode="1" android:versionName="1.0"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:smallScreens="true" /> <application android:name="org.qtproject.qt.android.bindings.QtApplication" android:hardwareAccelerated="true" android:label="nftminter" android:requestLegacyExternalStorage="true" android:allowNativeHeapPointerTagging="false" android:allowBackup="true" android:fullBackupOnly="false"> <activity android:name="org.qtproject.qt.android.bindings.QtActivity" android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density" android:label="nftminter" android:launchMode="singleTop" android:screenOrientation="unspecified" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="android.app.lib_name" android:value="nftminter" /> <meta-data android:name="android.app.arguments" android:value="" /> <meta-data android:name="android.app.extract_android_style" android:value="minimal" /> </activity> <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.qtprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/qtprovider_paths"/> </provider> </application> </manifest>
Any help on how to use the camera on Android will be appreciated.
Many thanks for your time. -
@Mesrine
The problem is related to Permissions.
I was thinking that the camera start() function would do that but no.So I have reimplemented the qml type adding a function to ask for permission like:
void QRImageDecoder::requestPermision() { #if QT_CONFIG(permissions) QCameraPermission cPermission; switch (qApp->checkPermission(cPermission)) { case Qt::PermissionStatus::Undetermined: qApp->requestPermission(cPermission, this, &QRImageDecoder::requestPermision); return; case Qt::PermissionStatus::Denied: emit permissionRequested(false); return; case Qt::PermissionStatus::Granted: emit permissionRequested(true); return; } #endif }
then
the qml elementimport QtQuick 2.0 import QtMultimedia import QtQrDec import MyDesigns Item { id:root signal gotdata(string data); function stop() { timer.stop(); camera.stop(); startcamera.visible=true; } VideoOutput { id: videoOutput anchors.fill: root } MediaDevices { id: devices } Camera { id: camera active: false cameraDevice: devices.defaultVideoInput onErrorOccurred: (error,errorString)=> { console.log( devices.videoInputs); console.log(errorString) console.log(error) } } Connections { target: QRImageDecoder function onText_changed(boo) { root.gotdata(QRImageDecoder.text) } } Connections { target: QRImageDecoder function onPermissionRequested(boo) { if(boo) { camera.start(); timer.start(); startcamera.visible=false; } } } CaptureSession { id: capturesession camera: camera videoOutput: videoOutput imageCapture: ImageCapture { id: imageCapture onImageCaptured: { QRImageDecoder.source = imageCapture.preview } } } Timer { id: timer interval: 500; running: false; repeat: true onTriggered: imageCapture.capture() } MyButton { id:startcamera anchors.centerIn: root text:qsTr("ScanQr") onClicked: { QRImageDecoder.requestPermision(); } width:100 height:width*0.5 } }
-
M Mesrine has marked this topic as solved on