2015-09-01 32 views
5

Utilizzo FileProvider per i miei file interni da esporre alla Galleria, ad esempio. Per renderlo più uniforme, ho anche messo i miei file esterni nel provider (tramite percorso esterno) ma per i file nella scheda SD rimovibile non funziona. Dire qualcosa come quella cartella non è autorizzato.Android FileProvider per ext sdcard

Qualsiasi aiuto sarà molto apprezzato.

Thx

risposta

1

a partire da Android 4.4, le applicazioni normali non sono autorizzati ad accedere ai dispositivi di memorizzazione esterni secondari, cioè scheda SD, tranne che nelle loro directory specifiche del pacchetto, anche se è stato chiesto il permesso WRITE_EXTERNAL_STORAGE.

L'autorizzazione WRITE_EXTERNAL_STORAGE deve solo concedere accesso in scrittura la memorizzazione esterna primaria su un dispositivo. Le app non devono essere autorizzate a scrivere su dispositivi di archiviazione esterni secondari, tranne nelle loro directory specifiche del pacchetto come consentito dalle autorizzazioni sintetizzate. La limitazione delle scritture in questo modo garantisce che il sistema possa ripulire i file quando le applicazioni vengono disinstallate.

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

+0

Grazie! Ma a me sembra un po 'troppo caro. Vedi, nei documenti si dice che la memoria esterna dovrebbe essere scoperta se è semi-permanente come lo slot per schede SD in un vano batteria. Ma stai dicendo che la scheda SD è una memoria secondaria esterna e credo che a partire dalla 4.4 non venga scoperta tramite l'API di archiviazione. – zgulser

+0

In realtà nel termine di Android, sia "memoria interna" che "scheda SD" possono essere "memoria esterna".Ad esempio, usa il vecchio telefono Motorola Defy, ha solo 1 "memoria esterna", che è la scheda SD, quindi la scheda SD è la "memoria esterna primaria". Moto G, o un telefono Nexus, ha solo "memoria interna" ma nessuna scheda SD, quindi "memoria interna" è la "memoria esterna primaria" qui. Per i telefoni Samsung, hanno sia la memoria interna che la scheda SD, questa volta la memoria interna è la 'memoria esterna primaria', mentre' sd card' è la 'memoria esterna secondaria'. –

+1

Per confondere la questione ancora di più, viene la "memoria interna", la verità è che tutto il telefono deve avere "MEMORIA interna", solo grande o no. Usa lo stesso esempio, MEMORY interno di Defy è piccolo e usato solo come 'memoria interna ', mentre il nuovo modello di solito ha una memoria interna più grande, quindi solo una parte di esso è assegnata come' memoria interna' –

5

Diamo uno sguardo a FileProvider codice:

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 accettati sentieri assoluti alla directory con l'aiuto di tag root-path (costante DEVICE_ROOT). Quindi, basta aggiungere percorso assoluto alla vostra cartella dei file nel disco esterno secondario come di seguito:

<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" /> 

Nota official documentation non dice nulla circa <root-path>, quindi potrebbe cambiare in un futuro.

0

FileProvider non supporta lo storage esterno secondario (come le schede SD rimovibili). Questo è ancora più un problema in Android 7 e versioni successive, perché non è più possibile utilizzare l'uranio file://.

Ho già inviato un bug report here.

+2

ha provato questo file di percorsi XML di archiviazione della scheda SD di AVD e ha funzionato Gubatron

3

ho aggiunto questo root-path come suggerito da @Gubatron nel mio XML e funziona.

<?xml version="1.0" encoding="utf-8"?> 
<paths> 
    <external-path name="external_files" path="."/> 
    <root-path name="external_files" path="/storage/" /> 
</paths> 
+0

seconda linea, salvata la mia giornata ... –

0

Non sono del tutto sicuro del perché, ma il root-path non ha funzionato per me. Inoltre, non è documentato, quindi potrebbe esserci la possibilità che improvvisamente scompaia a un certo punto. Così ho finito per usare il seguente.

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

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

Il file viene memorizzato nella /storage/emulated/0/Android/data/MY_APP/files/hello.txt, che è propria posizione di memorizzazione della mia app nella scheda SD.

Problemi correlati