1 votes

Accédez aux fichiers de documents à partir de QML

Je suis en train d'écrire une application QML pour Nexus 4 sous Ubuntu Touch. Je dois accéder à certains fichiers stockés dans /home/phablet/Documents. Comme je l'ai lu ici: Utiliser des images pour un objet Image en QML pour Ubuntu Touch cela n'est pas possible. Dans le fichier AppArmor, j'ai entré "content-exchange" et "content-exchange-source". Je ne peux toujours pas accéder à certains fichiers locaux.

Y a-t-il une possibilité de lire ces fichiers? J'imagine qu'il doit y avoir un moyen, l'application musique a également accès aux fichiers musicaux!?

Merci de votre aide Jens

J'ai essayé ce code:

Audio {
    id: player
    source: "file:///home/phablet/Documents/fichier"
}

1voto

Chaitanya Points 121

Vous ne pouvez pas, du moins selon les règles de distribution via le magasin d'applications.

Comme mentionné dans la question à laquelle vous liez, le confinement par défaut des applications sur Ubuntu Touch restreint l'accès aux fichiers dans leurs propres silos. Vous pouvez modifier les paramètres de confinement pour votre application, mais cela peut ne pas être accepté dans le magasin d'applications. Vous pourriez également renoncer à accéder directement à ces fichiers et les importer via le content hub. Les détails suivent :

1) Importation de fichiers via le Content Hub

Le Content Hub fournit un mécanisme pour transférer des fichiers d'un silo d'application à un autre. Il peut être utilisé de différentes manières, mais vous souhaiteriez demander une importation de type documents. Une autre application pouvant agir comme source de documents s'ouvrira et présentera une liste de documents. Après que l'utilisateur en a sélectionné un (ou plusieurs), votre application reprend et reçoit un signal avec des informations sur les documents, qui ont été copiés à un emplacement où vous pouvez y accéder.

Bien sûr, la plupart des autres applications sont également sujettes à des problèmes de confinement des applications qui les empêchent d'accéder à ~/Documents. Cependant, le Visualiseur de documents et le Gestionnaire de fichiers sont traités de manière spéciale et ont accès à ces fichiers. Les deux peuvent agir comme sources de documents pour le Content Hub. Notez cependant que le Visualiseur de documents prend en charge seulement certains types de fichiers. Le Gestionnaire de fichiers exportera n'importe quel type de fichier en tant que document, mais il n'est pas installé par défaut.

(Au fait, le même type de mécanisme permet à l'application de musique d'accéder aux fichiers dans ~/Music. Je trouve cette décision de traiter de manière spéciale les applications par défaut plutôt problématique, notamment parce que cela signifie que leur code est inutile pour les auteurs d'applications à étudier.)

Je n'ai pas encore trouvé de bon tutoriel pour utiliser le Content Hub. À la place, je vais poster du code que j'ai écrit en essayant de comprendre le Content Hub moi-même. Il vous permet d'importer des documents soit à partir du fournisseur par défaut, soit à partir de celui sélectionné dans le "ContentPeerPicker".

manifest.json

{
    "name": "chtest.rschroll",
    "architecture": "all",
    "title": "chtest",
    "hooks": {
        "chtest": {
            "apparmor": "chtest.apparmor",
            "desktop":  "chtest.desktop"
        }
    },
    "version": "0.1",
    "framework" : "ubuntu-sdk-14.10"
}

chtest.apparmor

{
    "policy_groups": [
        "networking",
        "webview",
        "content_exchange"
    ],
    "policy_version": 1.2
}

main.qml

import QtQuick 2.0
import Ubuntu.Components 0.1
import Ubuntu.Components.ListItems 0.1 as ListItem
import Ubuntu.Components.Popups 0.1
import Ubuntu.Content 0.1

MainView {
    id: mainView
    applicationName: "chtest.rschroll"

    width: units.gu(100)
    height: units.gu(75)

    PageStack {
        id: pageStack
        Component.onCompleted: pageStack.push(root)

        Page {
            id: root
            title: i18n.tr("Import Content...")
            visible: false

            property var activeTransfer

            Column {
                anchors.fill: parent
                spacing: units.gu(2)
                Row {
                    height: units.gu(6)
                    anchors {
                        left: parent.left
                        right: parent.right
                        horizontalCenter: parent.horizontalCenter
                    }
                    spacing: units.gu(3)
                    Button {
                        text: i18n.tr("... Du fournisseur par défaut")
                        onClicked: {
                            root.activeTransfer = peer.request();
                        }
                    }
                    Button {
                        text: i18n.tr("... Du fournisseur choisi")
                        onClicked: {
                            pageStack.push(picker);
                        }
                    }
                }

                Label {
                    id: label
                    width: parent.width
                }
            }

            function importItems(items) {
                var string = "";
                for (var i = 0; i < items.length; i++) {
                    string += i + ") " + items[i].url + "\n";
                    /* Vous pouvez utiliser items[i].move() pour placer le contenu quelque part de manière permanente. */
                }
                label.text = string;
            }

            /* Le ContentPeer définit les types de contenu pouvant être importés. Pour une raison quelconque,
               handler doit être défini sur Source pour indiquer que l'application est en cours d'importation. Cela me semble
               inversé. */
            ContentPeer {
                id: peer
                contentType: ContentType.Documents
                handler: ContentHandler.Source
                selectionType: ContentTransfer.Multiple
            }

            /* Cet élément GUI bloque le reste de l'interface utilisateur lorsqu'un transfert est en cours. */
            ContentTransferHint {
                anchors.fill: root
                activeTransfer: root.activeTransfer
            }

            /* Surveillez root.activeTransfer pour savoir quand le contenu est prêt à être utilisé. */
            Connections {
                target: root.activeTransfer
                onStateChanged: {
                    if (root.activeTransfer.state === ContentTransfer.Charged)
                        root.importItems(root.activeTransfer.items);
                }
            }
        }

        Page {
            id: picker
            visible: false
            /* Cela présente une grille d'icônes pour les applications pouvant vous fournir du contenu du
               type spécifié. */
            ContentPeerPicker {
                id: peerPicker
                visible: parent.visible

                handler: ContentHandler.Source  // Source pour obtenir du contenu, pour une raison quelconque
                contentType: ContentType.Documents

                onPeerSelected: {
                    peer.selectionType = ContentTransfer.Multiple;
                    root.activeTransfer = peer.request();
                    pageStack.pop();
                }
            }
        }
    }
}

2) Obtenir un accès direct à ces fichiers

Si cela vous semble trop compliqué, vous pouvez modifier le profil d'armure de votre application pour accorder un accès supplémentaire au système de fichiers. Par exemple, pour donner à votre application un accès en lecture à ~/Documents, vous ajouteriez à votre fichier JSON d'armure d'application la ligne

"read_path": ["@{HOME}/Documents/"]

Cela empêchera votre application d'être automatiquement approuvée lorsque vous la soumettez au magasin d'applications officiel. Au lieu de cela, un être humain devra l'examiner et décider d'approuver ou non votre application. Parfois ils le feront (Visualiseur de journaux). Parfois ils ne le feront pas (mon propre lecteur d'ebooks, Beru). Je n'ai trouvé aucune explication quant à pourquoi certaines applications sont acceptées et d'autres non.

Si vous ne voulez pas prendre de risques avec l'évaluateur, ou si vous prenez un risque et perdez, vous pouvez soumettre votre application à l'OpenStore, qui publie des applications qui ne peuvent pas être publiées dans le magasin officiel.

0voto

William Points 21

Utilisez la source : http://bazaar.launchpad.net/~music-app-dev/music-app/refactor/files

apparmor.json contient :

{
    "policy_version": 1.3,
    "policy_groups": [
        "audio",
        "content_exchange",
        "music_files_read",
        "networking",
        "usermetrics"
    ],
    "read_path": [
        "@{HOME}/.cache/media-art/",
        "@{HOME}/.cache/mediascanner-2.0/",
        "/media/*/*/"
    ],
    "write_path": [
        "@{HOME}/Music/Imported/"
    ]
}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X