2016-05-06 8 views
6

Sto provando a configurare un fileprovider per condividere il file. I miei file vengono salvati in una cartella "NomeApp" nella memoria esterna (allo stesso livello delle cartelle di Android, Film e Immagini).Android: FileProvider sulla cartella di memoria esterna personalizzata

Ecco il mio fornitore di file di configurazione:

<provider 
    android:name="android.support.v4.content.FileProvider" 
    android:authorities="com.mydomain.appname.fileprovider" 
    android:exported="false" 
    android:grantUriPermissions="true"> 
    <meta-data 
     android:name="android.support.FILE_PROVIDER_PATHS" 
     android:resource="@xml/file_paths"/> 
</provider> 

e la file_paths.xml:

<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <external-path name="mypath" path="AppName" /> 
</paths> 

Quando provo a accedere al mio file con:

Uri fileUri = FileProvider.getUriForFile(activity, "com.mydomain.appname.fileprovider", 
      new File("/storage/emulated/0/AppName/IMG_20160419_095211.jpg")); 

restituisce un errore: java.lang.IllegalArgumentException: Impossibile trovare la configurazione root che contiene /storage/emulated/0/AppName/IMG_20160419_095211.jpg su android.support.v4.content.FileProvider $ SimplePathStrategy.getUriForFile (FileProvider.java:678) su android.support.v4.content.FileProvider. getUriForFile (FileProvider.java:377)

Ha funzionato bene prima, quando stavo utilizzando built-in directory come le immagini o filmati, il mio file_paths.xml era definire in questo modo:

<external-path name="photos" path="Pictures" /> 
<external-path name="videos" path="Movies" /> 

Ma ora voglio archivia il mio file nella mia cartella personale. Ho perso qualcosa con la configurazione di FileProvider?

+0

Forse il problema è con il percorso hardcoded nel vostro 'costruttore File'. Usa 'new File (Environment.getExternalStorageDirectory()," AppName/IMG_20160419_095211.jpg ")' e vedi se hai più fortuna. – CommonsWare

+0

Ho appena provato e non funziona – budgw

risposta

1

Ho avuto la stessa cosa. Nel mio caso ho dovuto pulire la build in Android Studio (Build> Clean Project) ogni volta che modificavo il percorso del fileprovider in 'file_paths.xml'.

5

In primo luogo, so che questo è un vecchio post ma è la domanda più vicina pubblicata che è stata simile al mio problema, quindi posterò la mia soluzione.

La ragione di tale errore è perché il percorso che si intende inserire nel file del provider è o

  • a) scritto in modo errato e non esiste nel external-path
  • b) Usando il /storage/emulated/0 assoluto percorso

Restituisce Failed to find configured root that contains ... perché non riesce a trovare quella cartella. Quindi assicurati di scrivere solo la directory che vuoi condividere e assicurati che sia scritta correttamente. Ricordare che quando si dichiara external-path è l'equivoco di chiamare Enviornment.getExternalStorageDirectory() Poiché si scrive il nome della directory quando si crea il file, non è necessario fornire un path nel file del provider poiché tutto ciò che fa è mascherare qualsiasi valore sia in il percorso con il nome.

Così il vostro percorso del provider sarebbe: <external-path name="my_files" />

e il codice sarebbe:

File file = new File(new File(Environment.getExternalStorageDirectory(), "myfolder"), "file.ext"); 
Uri uri = FileProvider.getUriForFile(context, fileProvider, file); 

Il tuo percorso uri sarebbe poi cedere il seguente

content://fileprovider/my_files/myfolder/file.ext

Se trovassi fornito un percorso nel file del provider, quindi il tuo percorso uri sarebbe il seguente:

content://fileprovider/my_files/file.ext

+0

che cosa è fileprovider? nel contenuto: //fileprovider/my_files/file.ext –

+0

L'elemento "percorso" deve essere definito nelle definizioni xml in . Per specificare la directory root utilizzare: percorso = "." – GregM

0

ho riparato

<!--THIS IS EVIL--> 
    <root-path 
     name="sdcard1" 
     path="." />