Android6(Marshmallow)の新パーミッションモデル解説(開発者編(その2))
Android 6.0の中でも重要な要素の1つである「新パーミッションモデル」対応を行うための具体的な実装方法や注意点などについて紹介しています。今回はアプリ開発者の視点に立ち、新パーミッションモデル対応を行うときに、まず注意しておきたい2つのポイント(複数のパーミッションを利用する場合の実装、Android 6.0未満の端末の考慮)について紹介します。
神原健一の技術で広がる世界 第4回
- 2015年11月25日公開
はじめに
皆様、こんにちは。NTTソフトウェア株式会社の神原です。「Androidで広がる世界」の第4回目です。周りを見ていると、Android 6.0を搭載したスマホを使っている方が少しずつ増えてきた気がします。前回は、Android 6.0の「新パーミッションモデル」について、開発者視点で概要をご紹介しました。同記事は、こちらをご参照ください。
今回は引き続き、アプリ開発者の視点に立ち、新パーミッションモデル対応を行うときに、まず注意しておきたい2つのポイント(複数のパーミッションを利用する場合の実装、Android 6.0未満の端末の考慮)について紹介します。
複数のパーミッションを利用する場合の実装方法
前回紹介したアプリ(連絡先アクセス(読み込み/書き込み)、カメラアクセスを行うための3つのボタンを持ちます)を題材に紹介します。
パーミッション観点で、これら3つのボタンを押下したときの処理を正常に動作させるには、どのように実装すべきでしょうか?ここで押さえておくべきキーワードに、 パーミッショングループ というものがあります。 まず、この概念について解説します。Androidの各パーミッション(READ_CONTACTSなど)は、それぞれパーミッショングループというものに所属しています。パーミッショングループとは、パーミッションを目的別にグルーピングしたものという言い方もできます。パーミッショングループとパーミッションの具体例を幾つか紹介します。
パーミッショングループ(例) | パーミッション(例) |
---|---|
CONTACTS | READ_CONTACTS |
WRITE_CONTACTS | |
GET_ACCOUNTS | |
CAMERA | CAMERA |
各アプリがパーミッションの利用許可をもっているか否かは、 パーミッション毎ではなく、バーミッショングループ毎に管理されることになります。例えば、あるパーミッションの利用許可をユーザから得た場合、パーミッションそのものではなく、そのパーミッションが所属するパーミッショングループの利用許可を得たことになります。これにより、同一グループに属する他のパーミッションも利用可能となります。
具体的な例を用いて解説していきます。上記アプリを端末に新規インストールし、上から順番にボタンを1つずつ押下した場合、パーミッション利用についてどのように要求されるのでしょうか?順番に見ていきましょう。
(1)連絡先読み込み(READ_CONTACTS)は、ユーザから許可を得ていないため、前回紹介したようなパーミッション利用を求めるダイアログを表示する必要があります。ユーザが許可を選択した場合に限って、READ_CONTACTSが属するCONTACTSグループのパーミッションの利用許可を得たことになります。
(2)連絡先書き込み(WRITE_CONTACTS)の場合、すでに(1)で同一グループ(CONTACTS)のパーミッション利用を許可されているため、追加でユーザからパーミッション利用許可を得る必要はありません。パーミッション許可のダイアログを表示することなく、連絡先の書き込みを行うことができます。
(3)カメラアクセス(CAMERA)の場合、(1)とは異なるグループ(CAMERA)に属するため、新たにパーミッション利用を求めるダイアログを表示する必要があります。連絡先アクセスの場合と同様、ユーザが許可を選択した場合に限って、CAMERAグループのパーミッションの利用許可を得たことになります。
ちなみに、(1)と(3)のパーミッション利用許可ダイアログを表示するには、前回の記事で紹介したようなコードを書くことになります。ただ、今回のアプリのように、複数のパーミッションを利用する場合、パーミッション許可を必要な度に要求するのではなく、1度にまとめることも可能です。具体的には、前回紹介したrequestPermissions()メソッドを呼び出す際、連絡先アクセスとカメラアクセスの両方の利用許可を1度に取るというアプローチです。以下リストに示すようなソースコードを書くことで実現できます。
requestPermissions()メソッドの第1引数に、READ_CONTACTSとCAMERAの2つを指定しています。これにより、次の図のように、パーミッション許可を求めるダイアログが連続して表示されます。
ユーザによるパーミッションの許可結果(ダイアログの操作結果)は、先ほどのリスト内のonRequestPermissionsResult()のgrantResults(int配列)として渡されます。その値を用いて、必要な処理を行うことができます。
Android 6.0未満の端末の考慮
新パーミッションモデルは、Android 6.0から採用された仕様です。そのため、残念ながら、6.0未満の端末でこの機能を利用することはできません。また、前回紹介した新パーミッションモデルで最も重要な以下の3つのメソッド
- (1)checkSelfPermission()メソッド [android.content.Contextクラス]
- (2)requestPermissions()メソッド [android.app.Activityクラス]
- (3)onRequestPermissionsResult()メソッド ※コールバック [android.app.Activityクラス]
はAPIレベル23(Android 6.0)のものであるため、そのままAPIレベル23未満の端末で動かそうとすると、エラー(java.lang.NoSuchMethodError)が発生してしまいます。この問題を回避するには、幾つかのアプローチが存在しますが、Support Libraryを利用するのが良いでしょう。と言うのも、Support Libraryでも上記を実現するAPIが提供されているためです。これらのメソッドは、以下のパッケージで提供されています。
Support Library内の所属クラス | |
---|---|
checkSelfPermission() | android.support.v4.content.ContextCompat, android.support.v4.content.PermissionChecker |
requestPermissions() | android.support.v4.app.ActivityCompat |
onRequestPermissionsResult() | android.support.v4.app.ActivityCompat |
Support Libraryを用いて実装しておけば、Android 6.0(APIレベル23)以上の端末で実行した場合は、新バーミッションモデルに沿った振る舞いが行われます。Android 6.0未満の端末で実行した場合は、新バーミッションモデルの振る舞いにはならないものの、エラーは発生することなく正常に処理が行われます。当然ながら、利用するパーミッションは、Androidのバージョンによらず、AndroidManifest.xml内に
おわりに
今回は、新パーミッションモデルについて、開発者視点で応用的な内容を一部紹介しました。ただ、アプリの実装を行うには、今回紹介した内容に加え、利用許可が必要なパーミッションと不要なもの、ユーザビリティを考慮したパーミッション取得の契機、AndroidManifest.xmlにおけるtargetSdkVersionの値による挙動の違いなどについても考慮が必要となります。次回以降では、引き続きこれらのポイントについて解説していく予定です。
最後に、1つだけ宣伝させてください。このたび、Android Wearに関する書籍『Android Wearアプリ開発入門』(技術評論社/単著)を執筆致しました。もしよろしければ、ご覧いただけると幸いです。また、弊社には、モバイル系だけでなく、HTML5、PostgreSQL、Grails/Groovyなどに関する書籍を執筆している技術者もいたりと、さまざまなスペシャリストが在籍しているのも特徴の1つではないかと思います。それでは、次回の記事もお楽しみに。
参考URL(当社サイト)
新技術開発を好み、Androidは正式版が出る前から試用するなど、公私にわたってモバイルの世界に没頭。 プライベートで開発した「セカイフォン」で、 Multi-Screen UX Competition優秀賞受賞。MWC(バルセロナ)/IFA(ベルリン)/CES(ラスベガス)へのプロダクト出展、 国内外(デブサミやDroidconなど)のセミナー講演や書籍執筆(単著・共著含め5冊)などの活動も行っている。NTTテクノクロスきってのモバイル技術者。 プライベートでは旅行が好きで、現地の外国人にセカイフォンをデモすることが密かな楽しみ。