2015-09-01 6 views
5

Ich benutze FileProvider für meine internen Dateien, die zum Beispiel in der Galerie ausgesetzt werden. Um es einheitlicher zu machen, habe ich auch meine externen Dateien in den Provider (über externe-Pfad), aber für die Dateien in Wechseldatenträger-Karte funktioniert es nicht. Etwas wie diesen Ordner zu sagen, ist nicht autorisiert.Android FileProvider für ext sdcard

Jede Hilfe wird sehr geschätzt.

Thx

Antwort

1

von Android 4.4 starten, werden normale Anwendungen nicht für den Zugriff auf sekundäre externe Speichergeräte erlaubt, das heißt SD-Karte, außer in ihrem Paket spezifische Verzeichnisse, auch wenn Sie WRITE_EXTERNAL_STORAGE Erlaubnis angefordert.

Die WRITE_EXTERNAL_STORAGE Genehmigung darf nur Schreibzugriff auf den primären externen Speicher auf einem Gerät gewähren. Apps dürfen nicht auf sekundäre externe Speichergeräte schreiben, außer in ihre paketspezifischen Verzeichnisse, wie von synthetischen Berechtigungen zugelassen. Durch das Einschränken von Schreibvorgängen auf diese Weise wird sichergestellt, dass das System die Dateien bereinigen kann, wenn Anwendungen deinstalliert werden.

https://source.android.com/devices/storage/

+0

Vielen Dank! Aber es scheint mir ein bisschen vous. Sehen Sie, in den Dokumenten wird gesagt, dass externer Speicher aufgetaucht werden sollte, wenn es wie ein SD-Kartensteckplatz in einem Batteriefach halbpermanent ist. Aber du sagst, dass SD-Karte ein sekundärer externer Speicher ist, denke ich und ab 4.4 ist es nicht durch die Speicher-API aufgetaucht. – zgulser

+0

Eigentlich in androids Begriff, sowohl "interner Speicher" und "SD-Karte" kann "externer Speicher" sein.Verwenden Sie das alte Handy Motorola Defy als Beispiel, es hat nur 1 "externe Speicher", das ist SD-Karte, so dass die SD-Karte ist "primären externen Speicher". Moto G, oder ein Nexus-Handy, es hat nur "internen Speicher", aber keine SD-Karte, so "interner Speicher" ist hier der "primäre externe Speicher". Für Samsung-Handys haben sie sowohl internen Speicher und SD-Karte, dieses Mal ist der interne Speicher der "primäre externe Speicher", während "SD-Karte" ist der "sekundäre externe Speicher". –

+1

Um die Sache noch mehr zu verwirren, kommt es "interner Speicher", die Wahrheit ist, dass alle Telefone "internen MEMORY" haben müssen, nur groß oder nicht. Verwenden Sie das gleiche Beispiel, Defy's internes MEMORY ist klein und wird nur als 'interner Speicher' verwendet, während neue Modelle normalerweise einen größeren internen Speicher haben, also nur ein Teil davon als 'interner Speicher' zugewiesen ist. –

5

Lassen Sie uns einen Blick auf FileProvider Code nehmen:

private static PathStrategy parsePathStrategy(Context context, String authority) 
     ... 
     int type; 
     while ((type = in.next()) != END_DOCUMENT) { 
      if (type == START_TAG) { 
       final String tag = in.getName(); 
       final String name = in.getAttributeValue(null, ATTR_NAME); 
       String path = in.getAttributeValue(null, ATTR_PATH); 
       File target = null; 
       if (TAG_ROOT_PATH.equals(tag)) { 
        target = buildPath(DEVICE_ROOT, path); 
       } else if (TAG_FILES_PATH.equals(tag)) { 
        target = buildPath(context.getFilesDir(), path); 
       } else if (TAG_CACHE_PATH.equals(tag)) { 
        target = buildPath(context.getCacheDir(), path); 
       } else if (TAG_EXTERNAL.equals(tag)) { 
        target = buildPath(Environment.getExternalStorageDirectory(), path); 
       } 
       if (target != null) { 
        strat.addRoot(name, target); 
       } 
      } 
     } 
     return strat; 
    } 

FileProvider absolute pathes in das Verzeichnis mit Hilfe von Tag root-path (DEVICE_ROOT Konstante) akzeptiert. So fügen Sie einfach absoluten Pfad zu Ihren Dateien Ordner in sekundärer externer Disc wie unten:

<root-path path="/storage/extSdCard/Android/data/com.edufii/files/image/" name="image-ext2" /> 
<root-path path="/storage/extSdCard/Android/data/com.edufii/files/video/" name="video-ext2" /> 
<root-path path="/storage/extSdCard/Android/data/com.edufii/files/datafile/" name="datafile-ext2" /> 
<root-path path="/storage/extSdCard/Android/data/com.edufii/files/audio/" name="audio-ext2" /> 

Hinweis official documentation sagt nichts über <root-path>, so dass es in einer Zukunft geändert werden.

0

FileProvider unterstützt keine sekundären externen Speicher (wie entfernbare SD-Karten). Dies ist noch mehr ein Problem in Android 7 und höher - weil Sie die file:// Uris nicht mehr verwenden können.

Ich habe bereits einen Fehlerbericht here ausgegeben.

+2

versucht, dies auf meine AVD-SD-Karte Speicher XML Pfade Datei und es funktionierte Gubatron

3

Ich habe diesen Root-Pfad wie von @Gubatron in meinem XML vorgeschlagen hinzugefügt und es funktioniert.

+0

die zweite Zeile, rettete meinen Tag ... –

0

Ich bin nicht ganz sicher warum, aber root-path hat nicht für mich funktioniert. Außerdem ist es nicht dokumentiert, also könnte es eine Chance geben, dass es plötzlich an einem bestimmten Punkt verschwinden würde. Also habe ich das folgende benutzt.

<external-files-path name="external_files_path" path="/"/> 

File file = new File(getActivity().getExternalFilesDir(null), "hello.txt"); 

Die Datei wird in /storage/emulated/0/Android/data/MY_APP/files/hello.txt gespeichert, die eigene Speicherplatz auf der SD-Karte ist mein app ist.

Verwandte Themen