22

ファイルを共有するためのファイルプロバイダーをセットアップしようとしています。ファイルは外部ストレージの「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: Failed to find configured root that contains /storage/emulated/0/AppName/IMG_20160419_095211.jpg at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:678) ) 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 で何か見逃しましたか?

4

8 に答える 8

9

まず、これが古い投稿であることは知っていますが、私の問題に似た投稿された最も近い質問なので、解決策を投稿します。

そのエラーの理由は、プロバイダー ファイルで指定しているパスが次のいずれかであるためです。

  • a) スペルが間違っていて、external-path
  • b)/storage/emulated/0絶対パスの使用

Failed to find configured root that contains ...そのフォルダが見つからないため、返されます。したがって、共有したいディレクトリだけを書き、スペルが正しいことを確認してください。ファイルを作成するときにディレクトリの名前をexternal-path書くので、プロバイダ ファイルにEnviornment.getExternalStorageDirectory()a を指定する必要はありません。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

于 2017-01-24T22:08:05.870 に答える
1

私も同じことがありました。私の場合、「file_paths.xml」でファイルプロバイダーのパスを変更するたびに、Android Studio (ビルド > プロジェクトのクリーンアップ) でビルドをクリーンアップする必要がありました。

于 2016-05-25T11:47:43.487 に答える
1

<external-path name="mypath" path="AppName" />

name="mypath" - mypath はイメージ ファイル名の特定の部分である必要があります。サンプル コードから判断すると、すべてのイメージ ファイルの名前に「IMG」が含まれている場合、name="IMG" が機能します。

path="AppName" は、画像用に外部で作成したフォルダー名であり、最後に「/」が必要です。つまり、path="AppName/"

したがって、<external-path name="IMG" path="AppName/" />それを行う必要があり、FileProvider.getUriForFile() で Uri を要求すると、FileProvider が画像を見つけて他のアプリにアクセスできるようにする必要があります。

それが役に立てば幸い。

于 2018-10-25T17:13:08.753 に答える