Acesse arquivos de documentos do QML

1

Estou escrevendo um aplicativo QML para o Nexus 4 executando o Ubuntu touch. Eu tenho que acessar alguns arquivos armazenados em / home / phablet / Documents. Como eu li aqui: Use Imagens para um objeto Image em QML para Ubuntu Toque isso não é possível. No arquivo AppArmor eu digitei "content-exchange" e "content-exchange-source". Ainda não consigo acessar alguns arquivos locais.

Existe alguma possibilidade de ler esses arquivos? Eu acho que deve haver um jeito, o aplicativo de música também tem acesso a arquivos de música!?

Obrigado por ajudar Jens

Eu tentei este código:

Audio {
    id: player
    source: "file:///home/phablet/Documents/filename"
}
    
por Jens 13.07.2015 / 19:19

2 respostas

1

Você não pode, pelo menos segundo regras de distribuição através da loja de aplicativos.

Como observado na pergunta à qual você está vinculado, o confinamento do aplicativo padrão no Ubuntu Touch restringe o aplicativo ao acesso a arquivos em seus próprios silos. Você pode alterar as configurações de confinamento do seu aplicativo, mas isso pode não ser aceito na loja de aplicativos. Você também pode desistir de acessar esses arquivos diretamente e importá-los através do hub de conteúdo. Detalhes seguem:

1) Importando arquivos pelo Hub de conteúdo

O Hub de conteúdo fornece um mecanismo para transferir arquivos de um aplicativo silo para outro. Ele pode ser usado de várias maneiras diferentes, mas você deseja solicitar uma importação de documentos de tipo. Outro aplicativo que pode atuar como fonte de documentos será aberto e apresentará uma lista de documentos. Depois que o usuário seleciona um (ou mais), seu aplicativo retoma e recebe um sinal com informações sobre os documentos, que foram copiados para um local onde você possa acessá-los.

Naturalmente, a maioria dos outros aplicativos também está sujeita a problemas de confinamento de aplicativos que os impedem de acessar ~/Documents . No entanto, o Visualizador de documentos e o Gerenciador de arquivos são tratados especialmente e recebem acesso a esses arquivos. Ambos podem atuar como fontes do Content Hub para documentos. Observe que o Visualizador de Documentos suporta apenas alguns tipos de arquivos. O Gerenciador de arquivos exportará qualquer tipo de arquivo como documento, mas não é instalado por padrão.

(By the way, o mesmo tipo de mecanismo permite o acesso de aplicativos de música para arquivos em ~/Music . Acho que esta decisão especial caso os aplicativos padrão bastante problemáticos, não menos importante, porque significa que seu código é inútil para autores de aplicativos estudarem.)

Ainda não encontrei um bom tutorial para usar o Hub de conteúdo. Em vez disso, vou postar algum código que escrevi ao tentar entender o Hub de conteúdo sozinho. Ele permite importar documentos do provedor padrão ou de um selecionado do "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("... From default provider")
                        onClicked: {
                            root.activeTransfer = peer.request();
                        }
                    }
                    Button {
                        text: i18n.tr("... From choosen provider")
                        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";
                    /* You may want to use items[i].move() to put the content somewhere permanent. */
                }
                label.text = string;
            }

            /* The ContentPeer sets the kinds of content that can be imported.  For some reason,
               handler must be set to Source to indicate that the app is importing.  This seems
               backwards to me. */
            ContentPeer {
                id: peer
                contentType: ContentType.Documents
                handler: ContentHandler.Source
                selectionType: ContentTransfer.Multiple
            }

            /* This is a GUI element that blocks the rest of the UI when a transfer is ongoing. */
            ContentTransferHint {
                anchors.fill: root
                activeTransfer: root.activeTransfer
            }

            /* Watch root.activeTransfer to find out when content is ready for our use. */
            Connections {
                target: root.activeTransfer
                onStateChanged: {
                    if (root.activeTransfer.state === ContentTransfer.Charged)
                        root.importItems(root.activeTransfer.items);
                }
            }
        }

        Page {
            id: picker
            visible: false
            /* This presents a grid of icons for apps that can give you content of the
               specified type. */
            ContentPeerPicker {
                id: peerPicker
                visible: parent.visible

                handler: ContentHandler.Source  // Source to get content, for some reason
                contentType: ContentType.Documents

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

2) Obtendo acesso direto a esses arquivos

Se isso parecer muito trabalho, você poderá alterar o perfil de sua armadura de aplicativo para conceder acesso adicional ao sistema de arquivos. Por exemplo, para conceder ao seu aplicativo acesso de leitura a ~/Documents , você adicionaria ao arquivo JSON da sua armadura de aplicativo a linha

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

Isso impedirá que seu aplicativo seja aprovado automaticamente quando você o enviar para a loja de aplicativos oficial. Em vez disso, um humano terá que olhar para ele e decidir se aprova ou não sua inscrição. Às vezes eles vão (Log Viewer). Às vezes eles não vão (meu próprio leitor de ebook, Beru). Não encontrei nenhuma explicação sobre o motivo de alguns apps serem aceitos e outros não.

Se não quiser jogar com o revisor ou se apostar e perder, envie seu aplicativo para o OpenStore , que publica aplicativos que não podem ser publicados na loja oficial.

    
por Robert Schroll 14.07.2015 / 00:51
0

Use a fonte: link

apparmor.json existe:

{
    "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/"
    ]
}
    
por Velkan 14.07.2015 / 00:47