2016年7月4日月曜日

[Android]android.os.FileUriExposedException

拙著「読書日記」で本の表紙をカメラで撮って、本を検索したり、保存したりする機能があります。
カメラ機能自体は自前では作らず他のアプリを利用しています。

ここに書き込んでくださいね というのを下記のメソッドでUriにして指定していたのですがandroid Nでは動かなくなりました。
android.net.Uri::fromFile(File)

Caused by: android.os.FileUriExposedException: file:///storage/emulated/0/Pictures/jp.torifuku.actionimagecapturesample/1467635903900.jpg exposed beyond app through ClipData.Item.getUri()
  at android.os.StrictMode.onFileUriExposed(StrictMode.java:1799)
  at android.net.Uri.checkFileUriExposed(Uri.java:2346)

ここに議論がありますが、Issueではないそうです。

ファイル システムのパーミッションの変更 というものに該当するそうです。

どうすればいいかというと、概要は下記の通りです。
* android:name="android.support.v4.content.FileProvider"(provider)をAndroidManifest.xmlに追加
* android.support.v4.content.FileProvider::getUriForFile(Context, String, File)でFile -> Uriにする

Android Developersのガイドではここにあります。

今回作ったサンプルをGithubに公開しておきます。
(ポイントを絞って短いサンプルにするつもりが、Runtime Permissionsをやっているとそれなりの長さになってしまいました……)

ラムダ式つかいました。