Hintergrund
Ich habe ein paar Apps, die eine SD-Karte für die Dateisynchronisierung verwenden. Der gestörte externe SD-Kartenzugriff auf Kitkat ist immer noch ein großes Problem, aber ich versuche, dies mit der neuen API auf Lollipop für die Benutzer, die dies haben, zu lösen.
Ich habe erfolgreich die Berechtigung für die SD-Karte angefordert und beibehalten und kann Dateien im Root-Uri auflisten, die von der Grant-Berechtigungsaktivität zurückgegeben wurden.
Weitere Informationen dazu finden Sie hier: how-to-use-the- New-SD-Karte-Zugang-API-präsentiert-für-Lollipop
Der Benutzer kann dann einen beliebigen Ordner / Unterordner für die Synchronisierung auswählen und das Ordnerdokument Uri als Zeichenfolge in der Datenbank beibehalten.
Problem
Später, möglicherweise nach dem Neustart der App, kann die Synchronisierung von Dateien initiiert werden. Ich versuche dann, die Dateien in einem Unterordner aufzulisten (erinnern Sie sich, ich habe die richtige Erlaubnis gewährt und die Persistenz davon funktioniert und gewährt mir auch Zugang zu allen Kindern).
Ich erstelle dann eine neue Instanz von DocumentFile aus der gespeicherten Zeichenfolge und versuche, die Dateien aufzulisten:
%Vor%Das Problem ist listFiles gibt immer die Kinder an der Wurzel Uri gewährt und nie die Kinder der tatsächlichen Uri Ich gebe die DocumentFile.fromTreeUri Methode.
Ich habe den Quellcode von DocumentFile und es scheint, dass dort ein Fehler ist, insbesondere sehe ich nicht die Notwendigkeit, den Uri weiter zu ändern:
%Vor%Wenn wir uns die Quelle von DocumentsContractApi21.prepareTreeUri anschauen, sehen wir, dass die Uri neu erstellt wird:
%Vor%Und die Methoden, die es aufruft:
%Vor%Die gefundene Dokument-ID von getTreeDocumentId entspricht immer der Root-Uri-ID, unabhängig davon, mit welchem Uri die Methode aufgerufen wird. Dies macht es unmöglich, untergeordnete Ordner mit den bereitgestellten Framework-Methoden aufzulisten.
Lösung
Bitte korrigieren Sie die Methode fromTreeUri, um nicht immer die Uri-ID des Stammdokuments zu verwenden.
Der folgende hässliche Hack behebt das Problem, das ich wirklich nicht möchte.
%Vor%Tags und Links android android-5.0-lollipop android-sdcard documentfile