2017-09-12 1 views
0

ich einen Baum habe URI, die ich von ACTION_OPEN_DOCUMENT_TREE bekam, wie kann ich eine bekommen Documentfile, die ein Kind dieses Baumes ist ohne findFiles() mit? Vorausgesetzt, dass ich weiß, wie man seine documentId, ihren absoluten Pfad oder ihren URI erhält. Ich benötige die Berechtigungen, die mit der Dokumentstruktur verknüpft sind. Dieseein Documentfile erhalten, die ein Kind von einem Dokumentenbaum ist ohne Verwendung von Findfiles()

ist, was ich habe jetzt:

DocumentFile rootTree = DocumentFile.fromTreeUri(context, rootTreeUri); 
DocumentFile docFile = rootTree.findFile(fileName); 

Es gibt docFile als TreeDocumentFile, Kind meiner Wurzel. Ich habe Schreibberechtigung und kann createFile() darauf verwenden, da es sich unter dem Dokumentbaum von ACTION_OPEN_DOCUMENT_TREE befindet.

So funktioniert es, aber findFile() ist wirklich langsam.

Wenn ich versuche, DocumentsContract zu verwenden wie so:

// I know how to build the documentId from the file's absolute path 
Uri uri = DocumentsContract.buildTreeDocumentUri(rootTreeUri.getAuthority(), documentId); 
DocumentFile docFile = DocumentFile.fromTreeUri(context, uri); 
// Result: "content://com.android.externalstorage.documents/tree/1A0E-0E2E:myChildDirectory/document/1A0E-0E2E:myChildDirectory" 

Es gibt einen neuen TreeDocumentFile bei docFile verwurzelt ist, nicht docFile als Kind meiner ursprünglichen Dokumentenbaum (root). Also habe ich keine Schreibberechtigung für diesen Baum.

Und wenn ich wie so versuchen:

Uri docUri = DocumentsContract.buildDocumentUriUsingTree(rootTreeUri, documentId); 
// Result: "content://com.android.externalstorage.documents/tree/1A0E-0E2E:/document/1A0E-0E2E:myChildDirectory" 

bekomme ich einen URI, der tatsächlich aussieht wie das, was ich will, aber es ist ein URI, kein Documentfile.

Wenn ich das Gleiche tun wie oben, aber ein Documentfile aus diesem uri mit fromTreeUri() bauen:

Uri docUri = DocumentsContract.buildDocumentUriUsingTree(rootTreeUri, documentId); 
DocumentFile docFile = DocumentFile.fromTreeUri(context, docUri); 
// Result: "content://com.android.externalstorage.documents/tree/1A0E-0E2E:/document/1A0E-0E2E:" 

ich den ursprünglichen Baum Documentfile, kein Kind des Documentfile darstellt.

+0

"Ich bekomme einen URI, der tatsächlich aussieht wie ich will, aber es ist ein URI, kein DocumentFile" - benutze 'fromSingleUri()' auf 'DocumentFile', um das in eine' DocumentFile' zu ​​bringen. – CommonsWare

+0

Ich habe keine Schreibberechtigung für eine so erstellte "DocumentFile" und kann 'createFile()' nicht verwenden. – jeanv

+0

Das ist seltsam. AFAIK, du solltest Rechte für den gesamten Baum haben. Unter dem Deckblatt verwendet 'DocumentFile' einfach' DocumentsContract' für diese Art von Sache - es ist nicht so, als hätte 'DocumentFile' spezielle Zugriffsrechte, die Sie nicht haben. – CommonsWare

Antwort

1

Was Sie wollen, ist mit den aktuellen APIs nicht möglich. Der einzige Weg, um eine TreeDocumentFile zu machen (die private Unterklasse von DocumentFile die createFile, createDirectory, listFiles und renameTo unterstützt) ist durch DocumentFile.fromTreeUri (was gibt Ihnen nur das Stammbaum-URI wie Sie gefunden haben) oder durch eine bestehende TreeDocumentFile ‚s listFiles() Methode, die findFile intern verwendet wird.

Sie sollten eine Feature-Anforderung an issuetracker.google.com ablegen, um eine neue statische Methode hinzuzufügen, die das tut, was Sie benötigen.

+0

Ich verstehe. Vielen Dank für Ihre Antwort. – jeanv

Verwandte Themen