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)に変更しました。

3. 参考