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

asaba 著者:asaba

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

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

  • この記事いいね! (0)

著者について

asaba

asaba author

好きなもの:RPG、チョコミント 少しずつ頑張ります。