web-dev-qa-db-ja.com

Android:FileProvider IllegalArgumentException /data/data/**/files/Videos/final.mp4を含む構成済みのルートが見つかりませんでした

FileProviderを使用してプライベートパスからビデオを再生しようとしています。

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

コード:

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

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

これに関する手がかりはありますか?

おかげでニッツ

40
NitZRobotKoder

namepathが反転しています。 nameUriに含まれるものであり、pathはファイルシステム上のルート内の相対位置です。

と一緒に行きます:

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

基本的な状況はまったく同じでした。すべてを正しく定義しました(xmlのfiles-path)が、同じ例外につながるもう1つのことがあります。追加とコメントが読みにくいように、別の回答を追加します。

私は次のようなファイルを保存するディレクトリを作成/読み取りました:

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

これにより、次のようなパスになります。

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

次に、ディレクトリの作成を次のように変更しました。

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

これにより、次のようなパスになります。

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

ドキュメントによると ディレクトリを開く 私が理解する限り、2つの方法は同等であるはずです。しかし、それは別の道を作ります...たぶん、ドキュメンテーションでは定式化が明確ではないかもしれませんが、間違って書かれています。

getDir(名前、モード)

アプリの一意のファイルシステムディレクトリ内に新しいディレクトリを作成します(または既存のディレクトリを開きます)。この新しいディレクトリは、getFilesDir()によって提供されるディレクトリ内に表示されます。

2
Diego Frehner