web-dev-qa-db-ja.com

IllegalArgumentException:FileProvider.getUriForFileでxxxを含む構成ルートを見つけることができませんでした

私は Androidチュートリアル に従ってファイルを共有しようとしています。私はFileProviderを次のように設定しました:

メインマニフェストxmlで:

_<provider
            Android:name="Android.support.v4.content.FileProvider"
            Android:authorities="com.example.mysecondapp.fileprovider"
            Android:exported="false"
            Android:grantUriPermissions="true" >
            <meta-data
                Android:name="Android.support.FILE_PROVIDER_PATHS"
                Android:resource="@xml/filepaths" />
        </provider>
_

res/xml/filpaths.xmlファイル:

_<paths xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <external-path name="myexternalimages" path="SpCars_album/" />
</paths>
_

そして私のコードでは、私は以下を試しています:

_File requestFile = new File(mImageFilenames[position]);
                try {
                    fileUri = FileProvider.getUriForFile(
                            SeventhActivity.this,
                            "com.example.mysecondapp.fileprovider",
                            requestFile);
                } catch (IllegalArgumentException e) {
                    Log.e("File Selector",
                            "The selected file can't be shared: " +
                                    mImageFilenames[position]);
                }
_

RequestFileは、ファイルの適切な作業パスでインスタンス化されます。そのファイルのパスは、getExternalFilesDir(Environment.DIRECTORY_PICTURES)が返すものから始まります。すべてが収まるように見えるので、エラーの原因を理解できません。前もって感謝します。

16
Hummus

そのファイルのパスは、getExternalFilesDir(Environment.DIRECTORY_PICTURES)が返すものから正確に始まります。

私の知る限り、それはあなたに_SpCars_album/_という名前のディレクトリを与えません。

すべてが収まるように見えるので、エラーの原因を理解できません。

指定したファイルは、定義されたルートからFileProviderが提供できるファイルではありません。


[〜#〜]更新[〜#〜]

これが FileProviderのドキュメントのバグ に関連付けられていることを忘れていました。 FileProviderおよび_<external-path>_は[〜#〜] [〜#〜]を実行しませんが、getExternalFilesDir()からではなく、Environment.getExternalStorageDirectory()。私は getExternalFilesDir()のサポートを提供するStreamProviderサブクラス を作成しました。

私のStreamProviderを使用して、_<external-path>_を_<external-files-path name="myexternalimages" path="Pictures/SpCars_album/" />_に置き換えれば、幸運が上がるはずです。

23
CommonsWare

これは古い質問ですが、同じような問題が発生しました。

私が見つけた怠惰な解決策はただ使うことです:

<external-path name="myexternalimages" path="Android/" />

GetExternalStorageDirectoryは "/ storage/emulated/0 /"を返すため、/ Android(1つ下のレベル)を共有すると、アプリ内のすべてのファイルにアクセスできます。

または、より正確にしたい場合は、次のようにできます。

<external-path name="myexternalimages" path="Android/data/YOUR_BUNDLE_ID/files/SpCars_album" />

これは正確ではありませんが、動作するようです!

8
eAi

私の場合、アプリグラドルの依存関係にimplementation 'com.Android.support:support-v4:28.0.0'を追加するとうまくいきました。 SDKプラットフォームのバージョン(私の場合は28.0.0)を適宜変更してください。

0
TA2018