checkSelfPermissionがPERMISSION_DENIEDしか返してくれない罠を踏み抜いた話


すでにリリース済みのアプリに対して某広告系ライブラリを入れた時に突如パーミッション関係が軒並みDENIEDを返すようになりパニックになったので自分のための備忘録として。

現象

checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)

もしくはその後、requestPermissionをコールした後にonRequestPermissionsResultで戻ってきた後の第三引数が全部PERMISSION_DENIEDになる。
ちなみに勿論パーミッションは許可された状態で起きる。
今回の場合はすでにリリース済みのアプリで、このあたりは元々元気に動いていたのに急にスンッ・・・とおかしくなったので事態の把握は楽でした。

原因と対応

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

AndroidManifest.xml で定義しているpermissionは上記のような定義だったのだけれど・・・
Merged Manifestのほうで確認してみると

/(^o^)\・・・
そう。ライブラリ側でuses-permissionmaxSdkVersionが有り難くも設定されていたのでそもそもmaxSdkVersionを超えるSDKバージョンの場合はuses-permissionの定義は無かったことになる。
すなわちcheckSelfPermissionがDENIEDなのは当然の結果だった・・・

ということで、

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="replace" />

node="replase"指定を追加して、有り難く設定されているライブラリ側のmaxSdkVersionは無視させて頂くことにした。

教訓

新しいライブラリをリリース済みアプリに入れる時は、Merged Manifestがどうなっているかちゃんとチェックしようね!ぜったいだよ!