web-dev-qa-db-fra.com

Android: FileProvider IllegalArgumentException Impossible de trouver la racine configurée contenant /data/data/**/files/Videos/final.mp4.

J'essaie d'utiliser FileProvider pour lire une vidéo à partir d'un chemin privé.

Java.lang.IllegalArgumentException: Failed to find configured root that contains /data/data/XXXXX(Package)/files/Videos/final.mp4

Code:

<paths>
    <files-path path="my_docs" name="Videos/" />
</paths>

Code Java:

File imagePath = new File(getFilesDir(), "Videos");
File newFile = new File(imagePath, "final.mp4");
Log.d(TAG, "-------------newFile:"+newFile.exists());//True here
//Exception in below line
Uri contentUri = FileProvider.getUriForFile(this,"com.wow.fileprovider", newFile);

Manifest.xml

<provider
    Android:name="Android.support.v4.content.FileProvider"
    Android:authorities="com.wow.fileprovider"
    Android:exported="false"
    Android:grantUriPermissions="true">

<meta-data
    Android:name="Android.support.FILE_PROVIDER_PATHS"
    Android:resource="@xml/file_paths" />

Des indices à ce sujet?

Merci Nitz

40
NitZRobotKoder

Vous avez votre name et votre path retournés. name est ce qui se passe dans Uri, et path est l'emplacement relatif dans la racine du système de fichiers.

Aller avec:

<paths>
    <files-path name="my_docs" path="Videos/" />
</paths>
54
CommonsWare

J'ai eu la même situation de base. J'ai tout défini correctement (files-path en xml) mais il y a encore une chose qui conduit à la même exception. J'ajoute une autre réponse juste comme un ajout et un commentaire ne serait pas bien lisible.

J'ai créé/lu le répertoire où je stocke les fichiers comme:

context.getDir("Documents", Context.MODE_PRIVATE) 

Cela conduit à un chemin comme:

/data/user/0/ch.myapp/app_Documents/6c3c70d5-af66-48ef-8dfc-f4341de4e1bd.docx

Puis j'ai changé la création du répertoire en:

File directory = new File(context.getFilesDir(), "Documents");
if (!directory.exists()) {
  directory.mkdir();
}

Cela conduit à un chemin comme:

/data/user/0/ch.myapp/files/Documents/6c3c70d5-af66-48ef-8dfc-f4341de4e1bd.docx

Selon la documentation Ouvrir un répertoire , les deux méthodes doivent être équivalentes pour autant que je sache. Mais cela crée un chemin différent ... Peut-être que la formulation n'est pas claire pour moi dans la documentation, mais pour moi, c'est mal écrit.

getDir (nom, mode)

Crée un nouveau répertoire (ou ouvre un répertoire existant) dans le répertoire unique du système de fichiers de votre application. Ce nouveau répertoire apparaît dans le répertoire fourni par getFilesDir ().

2
Diego Frehner