【android】Android7.0でのUri取得方法について

  • 2019年3月7日
  • 2019年3月7日
  • Java

復活したエミュレータでビルドをしたのですが、今度は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://ファイルを取得する方法です。これからアプリを一から作る分にはさほど苦労しないかもしれないですが、前からあるプログラム相手だと既存の仕様と睨めっこしなければいけないのでここで骨が折れます。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG