#Android6.0でのRuntime-Permissionの落とし穴
Android6.0から、アプリで使うpermission(権限)のうちいくつかは、実行時に権限を確認しないといけなくなったのはご存知の通り。
アプリで使うpermissionは AndroidManifest.xmlに記述すれば良いが、
実際には使用しているライブラリが権限を追加する場合があり、6.0の場合は
追加した覚えのないpermissionがアプリに付与されていることがあるので注意が必要。
例えば以下の例では、権限をなにも付与していない
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="tone.ne.jp.myapplication">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
しかし,ライブラリとしてplay-service-locationを使っている場合、設定アプリから権限を確認してみると、
位置情報とストレージの権限が付与されている。
(省略)
dependencies{
compile "com.google.android.gms:play-services-location:7.5.0"
}
これはビルド時にライブラリが使うpermissionをAndroidManifestに勝手に付与してるためで、permissionがmergeされた実際のmanifestは
app/build/intermediates/manifests/full/debug/AndroidManifest.xmlを見ればわかる
(省略)
<!-- Include required permissions for Google Maps API to run -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<android:uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
さらに詳しい説明を見たい場合は、
app/build/outputs/logs/manifest-merger-debug-report.txt
にて、mergeされた権限の情報をみることができる。
(READ/WRITE EXTERNAL_STORAGEを確認できる)
(省略)
ADDED from [com.google.android.gms:play-services-maps:7.5.0]
../play-services-maps/7.5.0/AndroidManifest.xml:21:22-64 uses-permission#android.permission.WRITE_EXTERNAL_STORAGE
android:uses-permission#android.permission.READ_EXTERNAL_STORAGE
IMPLIED from /Users/user1/AndroidStudioProjects/MyApplication3/app/src/main/AndroidManifest.xml:2:1-31:12 reason: com.google.android.gms.maps requested WRITE_EXTERNAL_STORAGE
ライブラリが付与するpermissionを取り除きたい場合は、以下のようにAndroidManifest.xmlで取り除くことができる。
(ストレージ権限は確認されなくなる)
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
tools:node="remove"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
tools:node="remove"/>
ただし,ライブラリがpermissionを付与されているかを確認するような実装になっているとは限らないので、注意が必要。当然ながら、SecurityExceptionを吐く場合もあるので、あくまで自己責任で注意してpermissionをOFFにするべき。