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.