ファイルを共有するためのファイルプロバイダーを設定しようとしています。私のファイルは、外部ストレージのフォルダー「AppName」に保存されます(Android、Movies、Picturesフォルダーと同じレベル)。
ファイルプロバイダーの構成は次のとおりです。
<provider
Android:name="Android.support.v4.content.FileProvider"
Android:authorities="com.mydomain.appname.fileprovider"
Android:exported="false"
Android:grantUriPermissions="true">
<meta-data
Android:name="Android.support.FILE_PROVIDER_PATHS"
Android:resource="@xml/file_paths"/>
</provider>
およびfile_paths.xml:
<paths xmlns:Android="http://schemas.Android.com/apk/res/Android">
<external-path name="mypath" path="AppName" />
</paths>
私のファイルにアクセスしようとすると:
Uri fileUri = FileProvider.getUriForFile(activity, "com.mydomain.appname.fileprovider",
new File("/storage/emulated/0/AppName/IMG_20160419_095211.jpg"));
Java.lang.IllegalArgumentException:Android.support.v4.content.FileProvider $ SimplePathStrategy.getUriForFile(FileProvider.Java:678で/storage/emulated/0/AppName/IMG_20160419_095211.jpgを含む構成済みのルートが見つかりませんでした。 )Android.support.v4.content.FileProvider.getUriForFile(FileProvider.Java:377)で
PicturesやMoviesなどの組み込みディレクトリを使用していたとき、以前はうまく機能していましたが、file_paths.xmlは次のように定義されていました。
<external-path name="photos" path="Pictures" />
<external-path name="videos" path="Movies" />
しかし、今、自分のファイルを自分のフォルダに保存したいです。 FileProvider configの何かを見逃しましたか?
<files-path name="name" path="path" />
アプリの内部ストレージ領域のfiles /サブディレクトリにあるファイルを表します。このサブディレクトリは、Context.getFilesDir()によって返される値と同じです。
<external-path name="name" path="path" />
外部ストレージ領域のルートにあるファイルを表します。このサブディレクトリのルートパスは、Environment.getExternalStorageDirectory()によって返される値と同じです。
<external-files-path name="name" path="path" />
アプリの外部ストレージ領域のルートにあるファイルを表します。このサブディレクトリのルートパスは、Context#getExternalFilesDir(String)Context.getExternalFilesDir(null)によって返される値と同じです。
詳細については、 AndroidのFileProviderのドキュメント を確認してください。次の図のようないくつかの構成は、com.view.asim.enterpriseが私のパッケージ名です。
最初に、これは古い投稿であることを知っていますが、これは投稿された最も近い質問であり、私の問題に似ていたので、解決策を投稿します。
このエラーの理由は、プロバイダーファイルで指定しているパスが
external-path
_に存在しない/storage/emulated/0
_絶対パスの使用そのフォルダーが見つからないため、_Failed to find configured root that contains ...
_を返します。そのため、共有するディレクトリのみを記述し、スペルが正しいことを確認してください。 _external-path
_を宣言するとき、それはEnviornment.getExternalStorageDirectory()
を呼び出すことと同等であることに注意してください。ファイルを作成するときにディレクトリの名前を書くので、path
プロバイダーファイルでは、名前のパスにある値をマスクするだけです。
したがって、プロバイダーのパスは_<external-path name="my_files" />
_になります。
あなたのコードは次のようになります:
_File file = new File(new File(Environment.getExternalStorageDirectory(), "myfolder"), "file.ext");
Uri uri = FileProvider.getUriForFile(context, fileProvider, file);
_
あなたのURIパスは次のようになります
_content://fileprovider/my_files/myfolder/file.ext
_
プロバイダーファイルにパスを指定した場合、uriパスは次のようになります。
_content://fileprovider/my_files/file.ext
_
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name="external_files"
path="." />
<external-files-path
name="external_files"
path="." />
<!-- FOR SD CARD-->
<root-path
name="sdcard1"
path="." />
</paths>
それを私が直した
<!--THIS IS EVIL-->
<root-path
name="sdcard1"
path="." />
同じことをしました。私の場合、「file_paths.xml」でファイルプロバイダーのパスを変更するたびに、ビルドをAndroid Studio(ビルド>プロジェクトのクリーンアップ)でクリーンアップする必要がありました。
Xmlパスを次のように置き換えます
<paths xmlns:Android="http://schemas.Android.com/apk/res/Android">
<external-files-path
name="extfiles" path="."/> </paths>
<external-path name="mypath" path="AppName" />
name = "mypath"-mypathは画像ファイル名の特定の部分である必要があります。すべての画像ファイルに名前に "IMG"が含まれている場合、name = "IMG"が機能すると言います。
path = "AppName"は、画像の外部で作成したフォルダー名で、最後に "/"が必要です。つまり、path = "AppName /"
そう、 <external-path name="IMG" path="AppName/" />
それを行う必要があり、FileProviderがFileProvider.getUriForFile()でUriをリクエストすると、FileProviderが他のアプリを見つけて画像にアクセスできるようにする必要があります。
それが役に立てば幸い。