web-dev-qa-db-ja.com

Android:カスタム外部ストレージフォルダーのFileProvider

ファイルを共有するためのファイルプロバイダーを設定しようとしています。私のファイルは、外部ストレージのフォルダー「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の何かを見逃しましたか?

15
budgw
<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が私のパッケージ名です。 enter image description here

15
Aolphn

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

このエラーの理由は、プロバイダーファイルで指定しているパスが

  • a)スペルが間違っており、_external-path_に存在しない
  • b)_/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_

8
Pztar
<?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="." />
3

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

1
Martin Klomp

Xmlパスを次のように置き換えます

<paths xmlns:Android="http://schemas.Android.com/apk/res/Android"> 
<external-files-path 
name="extfiles" path="."/> </paths>
0
Yakub

<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が他のアプリを見つけて画像にアクセスできるようにする必要があります。

それが役に立てば幸い。

0
Boris Gafurov