Файлы документов доступа от QML

Я пишу QML-приложение для Nexus 4 рабочее касание Ubuntu. Я должен получить доступ к некоторым файлам, хранившим в/home/phablet/Documents. Поскольку я читал здесь: Use Pictures для Объекта изображения в QML для Касания Ubuntu это не возможно. В AppArmor-файле я ввел "довольный обмен" и "довольный обменный источник". Я все еще не могу получить доступ к некоторым локальным файлам.

Там возможность состоит в том, чтобы считать те файлы? Я предполагаю, что должен быть путь, музыкальное приложение имеет доступ к музыкальным файлам также!?

Спасибо за помощь Jens

Я попробовал этот код:

Audio {
    id: player
    source: "file:///home/phablet/Documents/filename"
}
1
задан 13 April 2017 в 15:24

2 ответа

Вы не можете, по крайней мере, по правилам для распределения через App Store.

, Как отмечено в вопросе Вы связываетесь с, заключение приложения по умолчанию на Касании Ubuntu ограничивает приложение доступом к файлам в их собственных бункерах. Можно изменить настройки заключения для приложения, но это не может быть принято в App Store. Вы могли также разочароваться в доступе к этим файлам непосредственно и импорте их через довольное концентратор. Детали следуют:

1) Импортирующие файлы через Довольное Концентратор

Концентратор Содержания обеспечивает механизм для передачи файлов от одного бункера приложения до другого. Это может использоваться различными способами, но Вы хотели бы запросить импорт документов типа. Другое приложение, которое может действовать как источник документов, откроет и представит список документов. После того, как пользователь выбирает один (или больше), Ваше приложение возобновляет и получает сигнал с информацией о документах, которые были скопированы в местоположение, где можно получить доступ к ним.

, Конечно, большинство других приложений также подвергается проблемам заключения приложения, которые мешают им получать доступ ~/Documents. Однако Средство просмотра документов и Файловый менеджер рассматривают особенно и доступ, которому предоставляют, к этим файлам. Оба могут действовать как источники Концентратора Содержания для документов. Действительно обратите внимание, что Средство просмотра документов только поддерживает некоторые типы файлов. Файловый менеджер экспортирует любой тип файла как документ, но он не установлен по умолчанию.

(Между прочим, тот же вид механизма позволяет музыкальный доступ к приложениям файлам в ~/Music. Я нахожу это решение к особому случаю приложениями по умолчанию довольно проблематичный, не в последнюю очередь всех, потому что это означает, что их код бесполезен, чтобы авторы приложения учились.)

я должен все же найти хорошее учебное руководство для использования Довольного Концентратор. Вместо этого я отправлю некоторый код, который я написал при попытке понять Довольное Концентратор сам. Это позволяет Вам импортировать документы или от поставщика по умолчанию или от одного выбранного из "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) Получение прямого доступа к этим файлам

, Если это походит на слишком большую работу, можно изменить профиль брони приложения для предоставления дополнительного доступа к файловой системе. Например, для предоставления доступа для чтения приложения к ~/Documents Вы добавили бы к файлу брони своего приложения JSON строку

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

, Это будет препятствовать тому, чтобы Ваше приложение было автоматически утверждено, при представлении его официальному App Store. Вместо этого человеческая воля должны посмотреть на него и решить, принять ли Ваше заявление или нет. Иногда они будут (Средство просмотра журнала). Иногда они не будут (мое собственное устройство чтения электронных книг, Беру). Я не нашел объяснения относительно того, почему некоторые приложения приняты, и другие не.

, Если Вы не испытываете желание играть на деньги с рецензентом, или если Вы играете на деньги и проигрываете, можно отправить приложение OpenStore, который публикует приложения, которые не могут быть опубликованы в официальном хранилище.

1
ответ дан 7 December 2019 в 16:13

Используйте источник: http://bazaar.launchpad.net/~music-app-dev/music-app/refactor/files

apparmor.json там:

{
    "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/"
    ]
}
0
ответ дан 7 December 2019 в 16:13

Другие вопросы по тегам:

Похожие вопросы: