Я пишу QML-приложение для Nexus 4 рабочее касание Ubuntu. Я должен получить доступ к некоторым файлам, хранившим в/home/phablet/Documents. Поскольку я читал здесь: Use Pictures для Объекта изображения в QML для Касания Ubuntu это не возможно. В AppArmor-файле я ввел "довольный обмен" и "довольный обменный источник". Я все еще не могу получить доступ к некоторым локальным файлам.
Там возможность состоит в том, чтобы считать те файлы? Я предполагаю, что должен быть путь, музыкальное приложение имеет доступ к музыкальным файлам также!?
Спасибо за помощь Jens
Я попробовал этот код:
Audio {
id: player
source: "file:///home/phablet/Documents/filename"
}
Вы не можете, по крайней мере, по правилам для распределения через App Store.
, Как отмечено в вопросе Вы связываетесь с, заключение приложения по умолчанию на Касании Ubuntu ограничивает приложение доступом к файлам в их собственных бункерах. Можно изменить настройки заключения для приложения, но это не может быть принято в App Store. Вы могли также разочароваться в доступе к этим файлам непосредственно и импорте их через довольное концентратор. Детали следуют:
Концентратор Содержания обеспечивает механизм для передачи файлов от одного бункера приложения до другого. Это может использоваться различными способами, но Вы хотели бы запросить импорт документов типа. Другое приложение, которое может действовать как источник документов, откроет и представит список документов. После того, как пользователь выбирает один (или больше), Ваше приложение возобновляет и получает сигнал с информацией о документах, которые были скопированы в местоположение, где можно получить доступ к ним.
, Конечно, большинство других приложений также подвергается проблемам заключения приложения, которые мешают им получать доступ ~/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();
}
}
}
}
}
, Если это походит на слишком большую работу, можно изменить профиль брони приложения для предоставления дополнительного доступа к файловой системе. Например, для предоставления доступа для чтения приложения к ~/Documents
Вы добавили бы к файлу брони своего приложения JSON строку
"read_path": ["@{HOME}/Documents/"]
, Это будет препятствовать тому, чтобы Ваше приложение было автоматически утверждено, при представлении его официальному App Store. Вместо этого человеческая воля должны посмотреть на него и решить, принять ли Ваше заявление или нет. Иногда они будут (Средство просмотра журнала). Иногда они не будут (мое собственное устройство чтения электронных книг, Беру). Я не нашел объяснения относительно того, почему некоторые приложения приняты, и другие не.
, Если Вы не испытываете желание играть на деньги с рецензентом, или если Вы играете на деньги и проигрываете, можно отправить приложение OpenStore, который публикует приложения, которые не могут быть опубликованы в официальном хранилище.
Используйте источник: 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/"
]
}