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
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.
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>
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>