Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Mobile and Embedded
  4. Cannot safe image on android with camera
Qt 6.11 is out! See what's new in the release blog

Cannot safe image on android with camera

Scheduled Pinned Locked Moved Unsolved Mobile and Embedded
13 Posts 4 Posters 2.7k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S Offline
    S Offline
    sandro4912
    wrote on last edited by
    #1

    I have the following Issue.

    In my app I use QtMultimedia 5.14 and use its Camera class.

    However when I take a picture and try to safe it I get a exception like this in the Application Output:

    W libcamera_armeabi-v7a.so: qrc:/main.qml:55:19: QML Image: Cannot open: qrc:/data/user/0/org.qtproject.example.camera/files/IMG_00000015.jpg
    

    Does it mean I don't have the user rights on android to safe?

    The image safe code looks like this:

    Camera {
        id: camera
    }
    
    //...
    
    Connections {
        target: camera.imageCapture
    
        onImageSaved: {
            imagePaths.append({"path": path})
            listView.positionViewAtEnd();
        }
    }
    
    1 Reply Last reply
    0
    • sierdzioS Offline
      sierdzioS Offline
      sierdzio
      Moderators
      wrote on last edited by
      #2

      @sandro4912 said in Cannot safe image on android with camera:

      qrc:/

      QRC storage is read-only. Choose a different path.

      App data location, cache location and temp locations are writable even if you do not get any storage permissions from your user.

      (Z(:^

      1 Reply Last reply
      2
      • S Offline
        S Offline
        sandro4912
        wrote on last edited by
        #3

        stupid question. How can I change to a different path? What would be a valid path?

        jsulmJ 1 Reply Last reply
        0
        • S sandro4912

          stupid question. How can I change to a different path? What would be a valid path?

          jsulmJ Offline
          jsulmJ Offline
          jsulm
          Lifetime Qt Champion
          wrote on last edited by
          #4

          @sandro4912 See https://doc.qt.io/qt-5/qstandardpaths.html using it you can get the paths @sierdzio already mentioned

          https://forum.qt.io/topic/113070/qt-code-of-conduct

          S 1 Reply Last reply
          2
          • jsulmJ jsulm

            @sandro4912 See https://doc.qt.io/qt-5/qstandardpaths.html using it you can get the paths @sierdzio already mentioned

            S Offline
            S Offline
            sandro4912
            wrote on last edited by
            #5

            @jsulm So I have to make a C++ class with QStandardPaths or is it available directly in QML?

            jsulmJ 1 Reply Last reply
            0
            • S sandro4912

              @jsulm So I have to make a C++ class with QStandardPaths or is it available directly in QML?

              jsulmJ Offline
              jsulmJ Offline
              jsulm
              Lifetime Qt Champion
              wrote on last edited by
              #6

              @sandro4912 There is something in Qt Labs: https://doc.qt.io/qt-5/qml-qt-labs-platform-standardpaths.html

              https://forum.qt.io/topic/113070/qt-code-of-conduct

              1 Reply Last reply
              1
              • S Offline
                S Offline
                sandro4912
                wrote on last edited by
                #7

                I tryed it with the path but still no images. show up. Atleast the error does not appear anymore.

                I changed the path here.

                delegate: Image {
                            height: 100
                            //source: path
                            source: Labs.StandardPaths.writableLocation(Labs.StandardPaths.ApplicationsLocation)
                            fillMode: Image.PreserveAspectFit
                        }
                

                Full code:

                import QtQuick 2.14
                import QtQuick.Controls 2.14
                import QtMultimedia 5.14
                import Qt.labs.platform 1.1 as Labs
                
                ApplicationWindow {
                    visible: true
                
                    id: root
                
                    width: 1024
                    height: 600
                
                
                
                Rectangle {
                    width: parent.width
                    height: parent.height
                
                    color: "black"
                
                    VideoOutput {
                        anchors.fill: parent
                        source: camera
                    }
                
                    Camera {
                        id: camera
                    }
                
                    ListModel {
                        id: imagePaths
                    }
                
                    ListView {
                        id: listView
                
                        anchors.left: parent.left
                        anchors.right: parent.right
                        anchors.bottom: parent.bottom
                        anchors.bottomMargin: 10
                
                        height: 100
                
                        orientation: ListView.Horizontal
                        spacing: 10
                
                        model: imagePaths
                
                        delegate: Image {
                            height: 100
                            //source: path
                            source: Labs.StandardPaths.writableLocation(Labs.StandardPaths.ApplicationsLocation)
                            fillMode: Image.PreserveAspectFit
                        }
                
                        Rectangle {
                            anchors.fill: parent
                            anchors.topMargin: -10
                
                            color: "black"
                            opacity: 0.5
                        }
                    }
                
                    Image {
                        id: image
                        anchors.fill: parent
                    }
                
                    Connections {
                        target: camera.imageCapture
                
                        onImageSaved: {
                            imagePaths.append({"path": path})
                            listView.positionViewAtEnd();
                        }
                    }
                
                    Column {
                        id: buttons
                
                        anchors.top: parent.top
                        anchors.right: parent.right
                        anchors.margins: 10
                
                        spacing: 10
                
                        Button {
                            id: shotButton
                
                            text: "Take Photo"
                            onClicked: {
                                camera.imageCapture.capture();
                            }
                        }
                
                        Button {
                            id: playButton
                
                            text: "Play Sequence"
                            onClicked: {
                                parent.parent.startPlayback();
                            }
                        }
                
                        Button {
                            id: clearButton
                
                            text: "ClearSequence"
                            onClicked: {
                                imagePaths.clear()
                            }
                        }
                    }
                
                    property int _imageIndex: -1
                
                    function startPlayback()
                    {
                        root.state = "playing"
                        setImageIndex(0);
                        playTimer.start();
                    }
                
                    function setImageIndex(i)
                    {
                        _imageIndex = i;
                
                        if(_imageIndex >= 0 && _imageIndex < imagePaths.count) {
                            image.source = imagePaths.get(_imageIndex).path;
                        }
                        else {
                            image.source = "";
                        }
                    }
                
                    Timer {
                        id: playTimer
                
                        interval: 200
                        repeat: false
                
                        onTriggered: {
                            if (_imageIndex + 1 < imagePaths.count) {
                                setImageIndex(_imageIndex + 1);
                                playTimer.start();
                            }
                            else {
                                setImageIndex(-1);
                                root.state = "";
                            }
                        }
                    }
                
                    states: [
                        State {
                            name: "playing"
                            PropertyChanges {
                                target: buttons
                                opacity: 0
                            }
                            PropertyChanges {
                                target: listView
                                opacity: 0
                            }
                        }
                    ]
                
                    transitions: [
                        Transition {
                            PropertyAnimation { properties: "opacity"; duration: 200; }
                        }
                    ]
                }
                
                }
                
                1 Reply Last reply
                0
                • SGaistS Offline
                  SGaistS Offline
                  SGaist
                  Lifetime Qt Champion
                  wrote on last edited by
                  #8

                  Hi,

                  Did you check that the folder exist ?
                  The path returned by QStandardPaths will be valid but you have to create some of these folders on first use.

                  Interested in AI ? www.idiap.ch
                  Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                  1 Reply Last reply
                  1
                  • S Offline
                    S Offline
                    sandro4912
                    wrote on last edited by
                    #9

                    What do you mean by that I have to create the standard folder?

                    1 Reply Last reply
                    0
                    • SGaistS Offline
                      SGaistS Offline
                      SGaist
                      Lifetime Qt Champion
                      wrote on last edited by
                      #10

                      Check if the folder exist and if not well create it before creating the image file.

                      Interested in AI ? www.idiap.ch
                      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                      1 Reply Last reply
                      1
                      • S Offline
                        S Offline
                        sandro4912
                        wrote on last edited by
                        #11

                        how could I achieve that in the code above?

                        1 Reply Last reply
                        0
                        • SGaistS Offline
                          SGaistS Offline
                          SGaist
                          Lifetime Qt Champion
                          wrote on last edited by
                          #12

                          Create the folder ? I would do that in the C++ part on startup using QDir.

                          Interested in AI ? www.idiap.ch
                          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                          1 Reply Last reply
                          1
                          • S Offline
                            S Offline
                            sandro4912
                            wrote on last edited by
                            #13

                            I think the path should already exist since it is the ApplicationsLocation.

                            I tryed this:

                                Camera {
                                    id: camera
                                }
                                ListModel {
                                    id: imagePaths
                                }
                            
                            ```
                            ListView {
                                id: listView
                            
                                //...
                            
                                model: imagePaths
                            
                                delegate: Image {
                                    height: 100
                                    source: path
                                    fillMode: Image.PreserveAspectFit
                                }
                            
                                Rectangle {
                                    anchors.fill: parent
                                    anchors.topMargin: -10
                            
                                    color: "black"
                                    opacity: 0.5
                                }
                            }
                            
                            
                                ```
                            Image {
                                    id: image
                                    anchors.fill: parent
                                }
                            
                                Connections {
                                    target: camera.imageCapture
                            
                                    onImageSaved: {
                                        imagePaths.append({"path": Labs.StandardPaths.writableLocation(Labs.StandardPaths.ApplicationsLocation)})
                                        listView.positionViewAtEnd();
                                    }
                                }
                            

                            So my idea was when camera takes the picture i append in the model imagePaths the ApplicationsLocation Path.

                            Then when the delegate is used in the view it should load the Image from path.

                            If I try this it sayes QJSValue is not convertible to QDir

                            So what is wrong here?

                            1 Reply Last reply
                            0

                            • Login

                            • Login or register to search.
                            • First post
                              Last post
                            0
                            • Categories
                            • Recent
                            • Tags
                            • Popular
                            • Users
                            • Groups
                            • Search
                            • Get Qt Extensions
                            • Unsolved