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
Forum Updated to NodeBB v4.3 + New Features

Cannot safe image on android with camera

Scheduled Pinned Locked Moved Unsolved Mobile and Embedded
13 Posts 4 Posters 930 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