Android: FileProvider IllegalArgumentException Failed to find configured root that contains /data/data/**/files/Videos/final.mp4
Asked Answered
T

3

48

I am trying to use FileProvider to play a video from private path.Facing

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>

Java code:

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

Any clues on this?

Thanks Nitz

Tauro answered 10/7, 2015 at 15:58 Comment(1)
I was getting "Attribute is missing the Android namespace prefix" in @xml/file_paths while implementing Fileprovider..later somehow i ended up misplacing the name and path and ended up with this issue..Tauro
S
63

You have your name and your path flipped. name is what goes in the Uri, and path is the relative location within the root on the filesystem.

Go with:

<paths>
    <files-path name="my_docs" path="Videos/" />
</paths>
Stilwell answered 10/7, 2015 at 16:9 Comment(8)
Gosh!! Wonder how I misplaced it. You saved my day thanks.. :-)Tauro
Stuck with"java.lang.SecurityException: Permission Denial: opening provider android.support.v4.content.FileProvider from ProcessRecord{44c35948 3239:com.mxtech.videoplayer.ad/u0a307} (pid=3239, uid=10307) that is not exported from uid 10221" Trying to pass to video player via intent.Tauro
@NitZRobotKoder: If by "video player", you mean a separate app, then add FLAG_GRANT_READ_URI_PERMISSION to your Intent that you use with startActivity() to launch the player. If by "video player" you mean MediaPlayer, I'd go the FileDescriptor route rather than a ContentProvider. If by "video player" you mean VideoView, I have no suggestions.Stilwell
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Log.d(TAG, "-------------PAth:"+contentUri.getPath()); intent.setData(contentUri); intent.setType("video/mp4"); Sloved it but getting " Writing exception to parceljava.lang.IllegalArgumentException: the bind value at index 1 is null"Tauro
Pls see #31321810 Now taking file provider route.Trying to play using external video players available.Tauro
Intent intent = new Intent(); intent.setAction(android.content.Intent.ACTION_VIEW); intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.setDataAndType(contentUri, "video/*"); startActivity(intent); ..Worked setting type and data separate was the issue..Tauro
I forgot the getFilesDir(). Another thing to keep on lookout.Sessile
name is the parent directory and path is the subdirectory. It's confusing how the documentation explains it.Prehistory
L
11

change your provider XML to this.

<?xml version="1.0" encoding="utf-8"?>
<paths>
  <external-path name="external_files" path="." />
  <root-path name="external_files" path="/storage/" />
</paths>
Lammers answered 14/3, 2020 at 1:28 Comment(0)
K
5

I had the very same basic situation. I defined everything correctly (files-path in xml) but there is one more thing which leads to the same exception. I add another answer just as an addition and a comment would not be well readable.

I created/read the directory where i store the files like:

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

This leads to a path like:

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

Then i changed creating the directory to:

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

This leads to a path like:

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

According to the documentation Open a directory the two methods should be equivalent as far as i understand it. But it creates a different path... Maybe the formulation is just not clear for me in the documentation, but for me its wrongly written.

getDir(name, mode)

Creates a new directory (or opens an existing directory) within your app's unique file system directory. This new directory appears inside the directory provided by getFilesDir().

Kate answered 18/5, 2018 at 10:19 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.