web-dev-qa-db-fra.com

Android - FileProvider getUriForFile lorsque le fichier se trouve sur une carte SD externe

Actuellement, la méthode FileProvider getUriForFile génère IllegalArgumentException lorsque le fichier se trouve sur une carte SD externe

Lorsque le fichier est dans la mémoire de l'appareil (sous/stockage/émulé/0), cela fonctionne correctement.

 Uri videoUri = FileProvider.getUriForFile(this,
            getApplicationContext().getPackageName() + ".provider",
            new File(videoPath));

ici videoPath avait la valeur suivante:

videoPath =  /storage/extSdCard/Android/data/com.podcastcutter.debug/files/episodeMp3/TEDTalks (video)/Why you should love statistics - Alan Smith.mp4  

Mon fichier manifeste contient:

       <provider
        Android:name="Android.support.v4.content.FileProvider"
        Android:authorities="${applicationId}.provider"
        Android:exported="false"
        Android:grantUriPermissions="true">
        <meta-data
            Android:name="Android.support.FILE_PROVIDER_PATHS"
            Android:resource="@xml/provider_paths"/>
    </provider>

et ici les provider_paths:

<external-path name="external_files" path="."/>

Comment puis-je modifier la configuration de FileProvider pour résoudre ce problème?

Merci d'avance.

Exception générée:

Java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/extSdCard/Android/data/com.podcastcutter.debug/files/episodeMp3/TEDTalks (video)/Why you should love statistics - Alan Smith.mp4 
Android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.Java:711)                  
Android.support.v4.content.FileProvider.getUriForFile(FileProvider.Java:400)

Informations de configuration supplémentaires:

compileSdkVersion 25

buildToolsVersion "23.0.3"

minSdkVersion 16

targetSdkVersion 25

support libraries version : 25.1.1   
8
u2gilles

Comment puis-je modifier la configuration de FileProvider pour résoudre ce problème?

Tu ne peux pas. FileProvider ne prend pas en charge le stockage amovible.

1
CommonsWare

J'ai ajouté dans mon provider.xml cette ligne et fonctionne très bien pour obtenir l'URI du fichier depuis la carte SD:

<root-path name="external_files" path="/storage/" />

Fichier xml complet:

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

Le chemin d'accès de votre fournisseur est du mauvais type. Votre videoPath indique un chemin vers le stockage externe de votre application, mais le chemin de votre fournisseur utilise external-path qui est lié au stockage externe racine de l'appareil. (/storage/emulated/0)

Modifiez le chemin d'accès de votre fournisseur pour qu'il soit <external-files-path>...</external-files-path>

0
Pztar