[android] FileUriExposedExceptionの対処方法

FileUriExposedException とは

このエラーが発生する原因は下記です。

Android N (API 24+) ではアプリ間のファイル共有に大きな変更があり、file:// を使った Intent によるファイル共有ができなくなりました。
具体的には、Android N 向けアプリのプライベートディレクトリのパーミッションが 0700 になりました。ファイルの所有者であっても、このパーミッションを緩和することはできません。
よって、Android N 以降のアプリでは、file:// を含む Intent がアプリから外部アプリに発行されると FileUriExposedException が発生します。
Android N での file:// スキーマによるファイル共有の挙動より抜粋

対処方法

手順1

まずは、ファイル共有用のxmlファイルを作成します。(res/xml/provider_paths.xml)
このファイルがあることで何が起こるのかなど、意味が実はよくわかってないので知ってる方いましたら、教えてください〜

手順2

続いて AndroidManifest.xml にプロバイダーの記述を追加します。この中で先ほど作成したxmlを指定します。

手順3

最後に、Uriの取得方法を下記のように変更して、Intent.FLAG_GRANT_READ_URI_PERMISSIONを追加するとエラーが解消されるはずです。

*1… getMimeType(file) について、MimeTypeの取得方法はこちらも参考にどうぞ

参考文献

スポンサーリンク
レクタングル(大)