ランタイムパミッションの互換性(1)
Android OS 6.0(Marshmallow)でランタイムパーミッションが導入されましたが、Android OS 6.0端末を持っているのは、ほんの一握りのユーザです。現状ではAndroid6.0以下も考慮しつつアプリケーションを作成していく必要があります。ランタイムパーミッションの互換性及び注意事項について、以下の二点に関して記載していきたいと思います。
- 互換モードの動作
- サポートライブラリ―
互換モードとは
互換モードとは、Android6.0以上の端末で、インストールタイムパーミッションモデルで実行しているアプリケーションが、端末の設定画面から、特定のパーミッションをはく奪された時の事を言います。(わかりにくい)
※「互換モード」という用語は、わかりにくくあまり良くない気もしますが、Developer Previewの説明でそのような記載がGoogleにあり、また良い言葉が見つからないので、互換モードという言葉を以後使いたいと思います。
まず、TargetSdkVersionと実行環境とインストールタイムパーミッションモデルとランタイムパーミッションモデルについておさらいをしたいと思います。
パミッションモデル
Android6.0(API Level23)で、ランタイムパーミッションモデルという新しいパーミッションモデルが導入されました。ランタイムパーミッションモデルは、実行時にパーミッションの許可を与えるモデルです。一方インストールタイムパーミッションモデルは、従来のパーミッションモデルであり、アプリケーションインストール時にパーミッションを与えるモデルです。ランタイムパーミッションモデルが出現したために、従来のパーミッションモデルを示す言葉が新たに作られました。targetSdkVersionと実行環境
アプリケーションは、ManifestファイルにtargetSdkVersionを指定する事で、ランタイムパーミッションに対応しているアプリかを示します。23以上に設定した場合は、ランタイムパーミッションに対応している事を表します。(23はAPI Level23を表しAndroid 6.0という事を表現します)targetSdkVersion=23に指定したアプリは、AndroidOS6.0未満の実機でも動作します。この時インストールタイムパーミッションで動作します。このように、同じアプリでもインストールタイムパーミッションモデルで動作したり、ランタイムパーミッションモデルで動作します。
以下にそれぞれのパターンについて記載します。
実行環境 | targetSdkVersion 23以上 | targetSdkVersion 23未満 |
---|---|---|
Android OS 6未満 | Installtime model | Installtime model |
Android OS 6以上 | Runtime model | Installtime model 互換モードが存在する |
表1:実行環境とtargertSdkVersion
- ランタイムパーミッションに対応しているアプリをAndroid 6.0以上の端末にインストールした時は、ランタイムパーミッションモデルで動作します。(表1:左下)
- ランタイムパーミッションに対応したアプリを作成したとしても、Android OS 6.0未満の端末ではOSが新しいパーミッションモデルに対応していないため従来のインストールタイムパーミッションモデルで動作します。(表1:左上)
- ランタイムパーミッションに対応していないアプリをAndroid OS 6.0未満の端末にインストールした場合。これはAndroid6.0がリリースされる前の状態と同じですから、インストールタイムパーミッションモデルで動作します。(表1:右上)
- ランタイムパーミッションに対応してないアプリを、Android6.0以上の端末にインストールした場合は、インストールタイムモデルで動作します。これは過去にリリースされたアプリを、Nexus5Xで動かした時に該当します(表1:左下)
パミッションのはく奪
互換モードの時、インストールタイムモデルですので、アプリをインストールした状態で全てのパーミッションを取得しています。しかしながらAndroid6.0以上の端末ですので、設定メニューからアプリが取得しているパーミッションをはく奪する事が可能です。「設定」→「アプリ」→「アプリ情報」→「許可」
(※ targetSdkVersionが23未満の時は権限はく奪時に上記一番右のメッセージが表示されます)
この時アプリケーションは、パーミッションを持っていないのにも関わらず、パーミッションが必要なリソースにアクセスします。パーミッションが必要なリソースにパーミッションを持っていない状態でアクセスした場合通常は、SecurityExceptionが返りますが、互換モードの時のみSecurityExceptionは発生せず、電話帳なら0件のデータを返すなどダミーの動作をします。必ずハングアップをするという事はありませんが、今まで想定しなかった値が返ってくる事がありますので別の理由でハングアップするかもしれません。
さて、この互換モードですが、Google Developerサイトでは、ダミーの値を返したりすると記載あるだけで、具体的にどのような値が返るかの記載がありません。
アプリを作る側としては、それでは非常につらいですので、それぞれのパーミッションに対して、互換モードでどのような動作をするのか調査を行いました。
その結果に関しては、各パーミッション単位の結果になり長くなりますので、後日展開したいと思います。また、サポートライブラリの注意事項についても展開していきたいと思います。
最後に
実際もっと色々書きたかったのですが、「互換モード」の言葉の説明をしないと、次にいけない気がしたので、互換モードの事を書いたら、結構な量になってしまいました。今回は、とくにオチはありません。すんません