targetSdkVersionが23以上のとき、AndroidManifest.xmlでandroid.permission.ACCESS_FINE_LOCATIONのパーミッション追加しているのにcheckCallingOrSelfPermission()が通らなかったことから学ぶAndroidのパーミッション

こんにちは。tsmsogn です。

タイトルのとおり、targetSdkVersion23 以上のとき、AndroidManifest.xmlandroid.permission.ACCESS_FINE_LOCATION のパーミッション追加しているにも関わらず、checkCallingOrSelfPermission() で思った値が返ってこない現象にあたりました。

具体的なコードは以下のとおりです。

int res = checkCallingOrSelfPermission("android.permission.ACCESS_FINE_LOCATION");
boolean permissionGranted = res == PackageManager.PERMISSION_GRANTED;

環境

  • AndroidManifest.xmlACCESS_FINE_LOCATION の設定は追加済み
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <!-- Needed only if your app targets Android 5.0 (API level 21) or higher. -->
    <uses-feature android:name="android.hardware.location.gps" />
  • app/build.gradle の targetSdkVersion は 25

同じ問題に当たってる人もいる

stackoverflow.com

この通りに、targetSdkVersion25 となっていたのを 22 にするといくようになりました。

そもそもtargetSdkVerionって?

developer.android.com

にあるとおり、上位互換のための設定。

そもそもなぜそうなったの?

developer.android.com

ではどうするか?

https://developer.android.com/training/permissions/requesting.html?hl=ja

このとおりです。。。

まとめ

targetSdkVersion が 23 以上のときは、Dangerous パーミッションをリクエストするには、明示的にコードを書く必要があります。