Android7 で android.os.FileUriExposedException が発生した時の対処方法です。
(文中の【】は読み替えて下さい)
0. 環境
[Windows] 7
[Java] 1.8
[Android] 5.1.1
[Android API] 26
1. 問題
Androidアプリから一時ファイルを作成して、そのURIを外部のアプリに渡すという処理を実装してました。
(ファイルを作成して、Gmailに添付するなど)
Android7からfile://による指定ができなくなったため、下記のエラーが発生します。
android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/【アプリのパッケージ名】/temporary/【一時ファイル名】 exposed beyond app through ClipData.Item.getUri()
URIはFileProviderで作らないといけないそうです。
2. 対策
2-1. AndroidManifest.xml
まず、AndroidManifest.xmlにFileProviderの定義を追加します。
android:resource
には、2-2で作成するファイル名を指定。
2-2. res/xml/provider_paths.xml
次に、res/xml/provider_paths.xml を作成します。
後述の2-3でfileの保存先を
Environment.getExternalStorageDirectory()
の直下にしたので、それを表すexternal-path
を指定します。また、直下なので
path
はカレントディレクトリになります。
2-3. 該当処理を行っているActivity
- 最後に、URIの生成を下記(1)から(2)に変更しました。