Android6(Marshmallow)の新パーミッションモデル解説(開発者編(その1))
今回から数回に分けて、アプリ開発者視点で、Android 6.0の中でも重要な要素の1つである「新パーミッションモデル」対応を行うための具体的な実装方法や注意点などについて紹介していきます。
神原健一の技術で広がる世界 第3回
- 2015年10月28日公開
はじめに
皆様、こんにちは。NTTソフトウェア株式会社の神原です。「Androidで広がる世界」の第3回目です。Android 6.0の正式バージョンがついに配信開始されるとともに、6.0をプリインストールしたAndroidスマホが日本でも販売開始されましたね。前回は、Android 6.0の中でも重要な要素の1つである、「新パーミッションモデル」について、ユーザ視点でご紹介しました。同記事は、こちらをご参照ください。
今回から数回に分けて、アプリ開発者視点で、新パーミッションモデル対応を行うための具体的な実装方法や注意点などについて紹介していきます。
「新パーミッションモデル」対応の基本的な考え方
具体的なアプリを題材に解説をしていきます。まず、以下の図のとおり、連絡先アクセス(読み込み/書き込み)、カメラアクセスを行うための3つのボタンを持つアプリがあったとしましょう。例えば、「連絡先アクセス(読み込み)」ボタンをタップすると、連絡先の読み込みを試みます。ただ、Android 6.0以降では、その前に、連絡先へのアクセス許可をユーザから得るために、確認ダイアログを表示する必要があります。また、ユーザの操作結果によって、許可された場合は連絡先にアクセスでき、拒絶された場合はアクセスできないという振る舞いとなります。このような振る舞いを実現するには、開発者があらかじめ考慮して実装を行う必要があります。
「新パーミッションモデル」対応のアプリ実装例
それでは、上述の「連絡先アクセス(読み込み)」の許可取得について、具体的な実装を考えていきましょう。新パーミッションモデルに対応する場合、特に重要なポイントが3つあります。
- (1) 必要なパーミッションの利用許可状況の取得
- (2) ユーザへのパーミッション利用可否の確認
- (3) 利用許可に対するユーザの選択結果の取得
上記を実装するためのAPIが以下のとおり、提供されています。APIレベル23(Android 6.0)で追加されたAPIです。
- (1) checkSelfPermission()メソッド [Contextクラス]
- (2) requestPermissions()メソッド [Activityクラス]
- (3) onRequestPermissionsResult()メソッド ※コールバック[Activityクラス]
実装例を見てみましょう。以下リストに示すようなソースコードを書く必要があります。
ソースコードの流れを見ていきましょう。
- 初めに(1)で、 checkSelfPermission()メソッドを呼び出しています。そのとき、1つの引数を渡しています。
- String値(今回の例では、Manifest.permission.READ_CONTACTS )
このアプリが「連絡先アクセス(読み込み)」のパーミッション(Manifest.permission.READ_CONTACTS)の利用許可を持っているか否かを確認しています。持っていなかった場合は、許可を得るために次の(2)の処理を行います。
- 続いて(2)で、 requestPermissions()メソッドを呼び出し、パーミッション利用可否の確認を行っています。そのとき、以下の2つの引数を渡しています。
- String配列(今回の例では、 new String[]{Manifest.permission.READ_CONTACTS} )
- int値(今回の例では、 MY_PERMISSIONS_REQUEST_READ_CONTACTSというユーザ定義の定数 )
1つめは、確認したいパーミッションの配列、2つめは後述の処理に用いるためのユーザ定義のリクエストコード(例.private static final int MY_PERMISSIONS_REQUEST_READ_CONTACTS = 10)です。このメソッドの呼び出しにより、「連絡先へのアクセスを許可しますか?」というダイアログが表示されます。
- 前のステップで表示されたダイアログでは、ユーザは「許可」もしくは「許可しない」を選択することになります。ユーザがいずれかを選択した契機で、(3)の onRequestPermissionsResult()メソッドが呼び出されます(コールバック)。そのとき、3つの引数が渡ってきます。
- String値(今回の例では、 10 )
- String配列(今回の例では、 [android.permission.READ_CONTACTS] )
- int配列(今回の例では、 許可の場合[0(PERMISSION_GRANTED)]、不許可の場合[-1(PERMISSION_DENIED)] )
1つめは、requestPermissions()メソッド呼び出し時に利用した「ユーザ定義のリクエストコード」、2つめは「ユーザ確認を行ったパーミッションの配列」、3つめは「ユーザ確認結果が格納された配列」です。ここで、ユーザから許可を得られた場合は、連絡先にアクセスできることになります。あとは、ContactsContractクラスなどを用いて連絡先のデータを読み込み、画面への描画いった処理を実装することになります。
- このような実装を行うことで、Android 6.0端末において、必要なパーミッションの利用許可を得て、処理を行うことができます。ちなみに、パーミッションの利用許可を1度得ておけば、次回以降はユーザへの確認を再度行うことなく、そのパーミッションが必要な処理を行うことができます。ただ、利用許可を得ていても、ユーザが端末の設定から、その許可を剥奪することが可能です。そのようなケースも漏れなく考慮しておきましょう。
おわりに
今回は、新パーミッションモデルに関して、開発者視点で具体的な実装例を紹介しました。ただ、今回紹介した内容だけでなく、ほかにも設計や実装時に注意しなければならないポイントが幾つもあります。例えば、複数のパーミッションが必要な場合の実装方法、ユーザビリティを考慮したパーミッション取得の契機や、Android 6.0未満の端末(下位互換性)の考慮などです。次回以降では、これらのポイントについて解説していく予定です。ぜひ、次回の記事も読んでいただけると幸いです。お楽しみに。
参考URL
新技術開発を好み、Androidは正式版が出る前から試用するなど、公私にわたってモバイルの世界に没頭。 プライベートで開発した「セカイフォン」で、 Multi-Screen UX Competition優秀賞受賞。MWC(バルセロナ)/IFA(ベルリン)/CES(ラスベガス)へのプロダクト出展、 国内外(デブサミやDroidconなど)のセミナー講演や書籍執筆(単著・共著含め5冊)などの活動も行っている。NTTテクノクロスきってのモバイル技術者。 プライベートでは旅行が好きで、現地の外国人にセカイフォンをデモすることが密かな楽しみ。