復活したエミュレータでビルドをしたのですが、今度はFileUriExposedExceptionというエラーで詰みました。リファレンス曰く、Android7.0以降は、フレームワークによりfile:// URI の公開を禁止する StrictMode API ポリシーが適用されます。なのでAndroid7.0を対象にfile://と名の付くurlをインテントすると、このFileUriExposedExceptionを引き起こすみたいですね。自分のエミュレータも23以降は動いたのにApi24からカメラを起動しようとして落ちたので、恐らくuriを変換してfile://を受け取ろうとしたときにこれに引っかかったのだと思われます。なのでアプリ間でファイルを共有するには、content://URI を送信して、この URI への一時的なアクセス パーミッションを付与する必要があります。変換の仕方ですが、Android7.0以前では外部ファイルからuriを取得するときはUri.fromFileを使っていましたね。バージョンによって処理を場合は分岐させたい場合は、if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {}で分けておきましょう。
API24以前↓
imageUri = Uri.fromFile(picFile);
API24以降↓
Uri uri = FileProvider.getUriForFile( getActivity(), BuildConfig.APPLICATION_ID + ".fileprovider", picFile);
マニフェストにも以下のタグを追加していきます。
<provider android:name="com.android.tools.ir.server.InstantRunContentProvider" android:authorities="パッケージ名" android:multiprocess="true" /> ※authoritiesは、マニフェストの先頭部分にあるpackage=""から参照します。
レイアウトファイルにもBuildConfig.APPLICATION_IDがパスを取得できるようにパスを書いておきましょう。
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path android:name="external_files" android:path="." /> </paths>
以上がcontent://ファイルを取得する方法です。これからアプリを一から作る分にはさほど苦労しないかもしれないですが、前からあるプログラム相手だと既存の仕様と睨めっこしなければいけないのでここで骨が折れます。