Wählen Sie ein Verzeichnis / eine Datei mit Intent.ACTION_CREATE_DOCUMENT (Storage Access Framework) aus

8

Wie hier erklärt:

Ссылка

oder hier:

Ссылка

KitKat beschränkt das Schreiben auf den sekundären externen Speicher auf das paketspezifische Verzeichnis (obwohl einige Entwickler bereits eine Umgehung gefunden haben ...). Wenn Samsung die SD-Karte als sekundären externen Speicher verwendet und das 4.4.2-Update ausliefert, ist dies für viele Apps ein großes Problem geworden.

Meine App verfügt über eine Funktion zum Speichern als, die es dem Benutzer ermöglicht, ein beliebiges Verzeichnis auszuwählen, in dem eine Datei gespeichert werden soll. Ich verwende Intents wie org.openintents.action.PICK_DIRECTORY, com.estrongs.action.PICK_DIRECTORY oder meinen integrierten Datei-Explorer, um ein Verzeichnis auszuwählen. Natürlich kann der Benutzer auch einen beliebigen Pfad auf der SD-Karte auswählen, aber aufgrund der neuen Einschränkungen mit KitKat schlägt der eigentliche Speichervorgang fehl, wenn das Verzeichnis, zu dem meine App keinen Schreibzugriff hat, auf dieses Verzeichnis verweist.

Ich brauche einen alternativen Weg, um ein Verzeichnis auf KitKat auszuwählen, damit der Benutzer keine Fehlermeldung erhält, wenn er versucht, auf SD-Karte zu speichern. Das könnte erreicht werden, indem man nur Verzeichnisse auswählt, auf die die App Schreibzugriff hat.

Ich habe versucht, Intent.ACTION_CREATE_DOCUMENT wie folgt zu verwenden:

%Vor%

Das funktioniert gut und ich kann in die Datei schreiben, die der Benutzer ausgewählt hat, ABER ich kann nur bestimmte Verzeichnisse auswählen. Z.B. Für eine PDF-Datei wird das Download-Verzeichnis (passend zu Environment.DIRECTORY_DOWNLOADS) zurückgegeben, für JPG kann ich das Download-Verzeichnis und die Google-Laufwerke auswählen. Es gibt mir jedoch nicht die Möglichkeit, andere Ordner auf dem primären externen Speicher oder das paketspezifische Verzeichnis auf SD-Karte auszuwählen (ich habe verschiedene Inhaltstypen wie "* / *" oder DocumentsContract.Document.MIME_TYPE_DIR ausprobiert) ohne Erfolg).

Ich suche nach einem Weg, den Benutzer ein Verzeichnis auf dem primären externen Dateisystem auswählen zu lassen (wie es von Environment.getExternalStorageDirectory () zurückgegeben wird, das eigentlich ein interner Speicher ist) und alle Verzeichnisse, die das Framework haben würde Geben Sie mir Zugriff auf den sekundären externen Speicher, um eine Datei in diesem Verzeichnis zu speichern. Unabhängig davon, ob der Benutzer ein Verzeichnis oder eine Datei auswählt, spielt die App entweder den eigenen oder den vom Benutzer ausgewählten Dateinamen.

Alternativ wäre natürlich auch zu wissen, wie bestimmte Apps die Schreibbeschränkungen umgehen könnten ;-). ES Datei Explorer z.B. kann jede Datei in jedes Verzeichnis auf SD-Karte schreiben, wie ich von meinen eigenen Tests auf einem unrooted S4 mit sdcard bestätigen kann.

    
Emanuel Moecklin 21.03.2014, 02:20
quelle

3 Antworten

1

Wie in diesem ausführlichen Artikel erklärt, wenn Sie android.permission.WRITE_EXTERNAL_STORAGE anfordern, dann

  

Die Berechtigungen von primärer externer Speicher haben sich nicht geändert. Sie verhalten sich in 4.4 genauso wie zuvor.

Von den Änderungen an KitKat ist nur sekundärer externer Speicher betroffen - das einzige Verzeichnis, auf das Sie im sekundären externen Speicher Zugriff haben, ist eines, das Ihrer App zugewiesen ist. Sie erwähnen auch, dass auf Samsung-Geräten SD-Karte als sekundärer externer Speicher gilt.

    
ianhanniballake 21.03.2014 02:40
quelle
1

Haben Sie MIME_TYPE_DIR ausprobiert?

%Vor%

Bearbeiten: Dokumentanbieter

    
xmen 21.03.2014 14:06
quelle
1

Um externen Speicher in der DocumentsUI zu sehen (zB Dateiauswahldialog), müssen Sie "Show advanced devices" in den DocumentsUI Einstellungen aktivieren.

Dies ist eine Benutzereinstellung, daher kann sie nur manuell vom Benutzer geändert werden.

    
Nutomic 30.03.2014 23:37
quelle

Tags und Links