Android6(Marshmallow)の新パーミッションモデル解説(開発者編(その3))
Android 6.0の新パーミッションモデル対応を行うときに、注意しておきたい3つのポイント(利用許可を必要とするパーミッション、ユーザビリティを考慮したパーミッション取得契機、targetSdkVersionの値による挙動の違い)について紹介します。
神原健一の技術で広がる世界 第6回
- 2016年01月27日公開
はじめに
皆様、こんにちは。NTTソフトウェア株式会社の神原です。「Androidで広がる世界」の第6回目です。前回は番外編として、Androidで深まったエンジニアとしての歩みをご紹介しました。今回は、技術的な内容に話を戻して、第3回、第4回でご紹介した「Android 6.0 (Marshmallow)の新パーミッションモデル解説(開発者編)」の続きをお伝えします。必要に応じて、前回の記事もご参照ください。
アプリ開発者の視点に立ち、Android 6.0の新パーミッションモデル対応を行うときに、注意しておきたい3つのポイント(利用許可を必要とするパーミッション、ユーザビリティを考慮したパーミッション取得契機、targetSdkVersionの値による挙動の違い)について紹介します。
利用許可を必要とするパーミッション
第3回の記事で紹介したとおり、Android 6.0の端末において連絡先アクセス(「READ_CONTACTS」パーミッション利用)を行う場合、ユーザから同機能の利用許可を得る必要があります。アプリがその許可をユーザから得ていない場合は、同機能を利用することはできません。
ただ、その一方、スマホのバイブレーション鳴動(「VIBRATE」パーミッション利用)を行う場合は、Android 6.0端末でもユーザからの利用許可を必要としません。このように、パーミッションによって、実行時にユーザから利用許可が必要なものと不要なものが存在します。なぜ、そのような仕組みになっているのでしょうか?実は、これらパーミッションは、危険度に応じて2つのプロテクションレベルに分類されています(正確には、他にもレベルは存在しますが、本稿では触れません)。
- normal:ユーザのプライバシーには直接影響がなく、安全だとされているもの
- dangerous:ユーザの機密情報へのアクセスを行うなど、危険度が高いとされているもの
これらには、以下の特徴があります。
プロテクションレベル | AndroidManifest.xmlでの定義 | ユーザからの利用許可取得(実行時) |
---|---|---|
normal | 必要 | 不要 |
dangerous | 必要 | 必要(Android 6.0以上の場合) |
冒頭で触れた「VIBRATE」パーミッションはnormalに、「READ_CONTACTS」パーミッションはdangerousに、それぞれ分類されています。そのため、Android 6.0端末を用いる場合、実行時に前者はユーザ許可不要ですが、後者は許可が必要ということになります。 アプリのAndroid 6.0対応を行うときは、利用するパーミッションのプロテクションレベルを意識した実装が必要である ことに注意しましょう。
ユーザビリティを考慮したパーミッション取得契機
観点を変えて、Android 6.0以降で必要なパーミッションの利用許可は、どのタイミングで取得すべきでしょうか?アプリの動作だけを考えれば、該当機能を利用する前(アプリの起動直後でも、同機能を利用する直前のいずれでも)までに、ユーザから利用許可を取得しておけば問題ありません。
ただ、 利用許可を取得する契機次第ではユーザビリティを大きく損ねてしまう危険性 があります。例えば、アプリ起動直後に、多くのパーミッション許可のダイアログが次々と表示されると、ユーザはどのように感じるでしょうか?ユーザによってとらえ方は違えど、煩雑さを感じてアプリの利用を止めてしまうかもしれません。そうならないようにするには、ユーザビリティを考慮し、適切なパーミッション取得契機を検討すべきでしょう。
それでは、パーミッション取得契機として、具体的に取り得るパターンとその特徴を紹介します。
パーミッション取得契機 | 特徴 | 補足 |
---|---|---|
(1)初回起動時 | 全てのパーミッションを起動時(チュートリアル後等)に取得 | ・数が多いとユーザ操作は面倒 ・対応工数は、小 |
(2)該当機能の利用直前 | 該当機能を利用する直前に取得 | ・ユーザに理解してもらい易いが、ばらばらに確認するとユーザは面倒 ・対応工数は、中 |
(3)(1)+(2)の併用 | 頻繁に利用されるメイン機能は(1)で、まれに使うオプション機能は(2)等、組み合わせて取得 | ・ユーザビティの観点でバランスが取れた方式 ・対応工数は、大 |
それぞれ一長一短があります。そのため、 どれを採用すべきかは、アプリが必要とするパーミッションの内容や数を踏まえて、ユーザの負担にならない契機を検討する 必要があります。
また、以前紹介したrequestPermissions()メソッドを用いて表示されるダイアログでは、OSで予め決められた文言が表示されます。また、その内容をカスタマイズすることはできません。それゆえ、このダイアログを表示するだけでは、ユーザに目的を正しく理解されず許可を得られないケースが起こり得るかもしれません。そのため、必要であれば、アプリがなぜそのパーミッションを必要とするかについて、ユーザに追加ダイアログなどを通じて説明するといった対応を検討するのが良いでしょう。
targetSdkVersionの値による挙動の違い
パーミッションに関する振る舞いは、Androidアプリで必須のAndroidManifest.xml内のtargetSdkVersionの値によって大きく変わります。また、端末に搭載されているAndroidのバージョンによっても影響を受けます。これら2つの観点を用いて整理してみましょう。ちなみに、Android 6.0のAPIレベルは23です。
端末バージョン<6.0 | 端末バージョン>=6.0 | |
---|---|---|
targetSdkVersion<23 | 旧パーミッションの振る舞い | 新旧パーミッションの振る舞い ・インストール時点:許可確認有 ・実行時(初回):許可確認不要 ・パーミッション許可状態変更:可能 |
targetSdkVersion>=23 | 旧パーミッションの振る舞い | 新パーミッションの振る舞い ・インストール時点:許可確認無 ・実行時(初回):許可確認必要 ・パーミッション許可状態変更:可能 |
最初に、端末バージョンが6.0未満に該当する2つのカラムに注目しましょう。旧パーミッションで動作するため、実行時のパーミッション利用確認は不要です。
続いて、 端末バージョンが6.0以上の2つのカラム についてです。これはtargetSdkVersionの値によって振る舞いが変わります。
Android 6.0以上かつtargetSdkVersionが23以上 の場合は、これまでの記事で紹介したとおりの振る舞いとなります。インストール時の許可確認は不要なものの、利用許可を必要とするパーミッションについては実行時にその許可を得る必要があります。さらに、その許可状態は、ユーザがOS設定からあとで変更する可能性もあります。
Android 6.0以上かつtargetSdkVersionが23未満 の場合は、新旧パーミッションが混成された振る舞いとなります。具体的には、アプリのインストール時のパーミッション利用確認は行われるため、その時点で利用許可は得られたことになります。ただ、Android 6.0以上であればその許可状態をユーザがあとから変更(剥奪することも可能)できるため、実行時に、必要なパーミッションの利用権限を保有しているかの確認が必要となります。
アプリをAndroid 6.0に対応させるときは、これらの特徴を理解しつつ、以下のポイントにも注意することをお勧めします。
- 端末バージョン6.0未満と6.0以上の両対応:互換性を考慮して、Support Libraryを活用して適切に実装(第4回に関連トピックあり)
- 新パーションモデルの考慮:targetSdkVersionの値によらず、Android 6.0では対応必須(パーミッション許可状態はユーザが変更可能なため)
これらを踏まえ、適切に対応しましょう。
おわりに
今回は、新パーミッションモデルについて、開発者視点で応用的なトピックを紹介しました。読者の皆さんが開発されているアプリの対応時に参考にしていただければ幸いです。次回の記事もお楽しみに。
参考URL(当社サイト)
新技術開発を好み、Androidは正式版が出る前から試用するなど、公私にわたってモバイルの世界に没頭。 プライベートで開発した「セカイフォン」で、 Multi-Screen UX Competition優秀賞受賞。MWC(バルセロナ)/IFA(ベルリン)/CES(ラスベガス)へのプロダクト出展、 国内外(デブサミやDroidconなど)のセミナー講演や書籍執筆(単著・共著含め5冊)などの活動も行っている。NTTテクノクロスきってのモバイル技術者。 プライベートでは旅行が好きで、現地の外国人にセカイフォンをデモすることが密かな楽しみ。