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.