[この記事は Ian Lake、デベロッパー アドボケートによる Android Developers Blog の記事 "Building better apps with Runtime Permissions" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。]

Android 端末はカメラや、方向の取得、電話など多くの機能を備えています。これらの機能には、連絡先、スケジュール、現在地など大量のユーザー個人情報が紐づけられています。こうした個人情報は、各アプリがデータにアクセスできるようになる前に取得する必要のあるパーミッションで保護されています。Android 6.0 Marshmallow で最大の変更の 1 つは、実行時パーミッションが追加されたことです。API 23 対象のこの新たなパーミッションモデルは、これまでのインストール時パーミッションモデルに代わるもので、アプリは Android 6.0 以上のデバイス上で起動します。

実行時パーミッションによって、アプリがいつ、どのようなコンテキストでパーミッションを要求するか、管理できるようになります。つまり、Google Play からアプリをインストールしたユーザーは、インストール前にパーミッションのリストを確認する必要がないため、ユーザーは即座にアプリを入手できます。しかも、アプリに新規パーミッションが追加された場合でも、ユーザーが新規パーミッションを確認するまで、アプリのアップデートがブロックされることはありません。その代わり、必要に応じて、新しく追加された実行時パーミッションを要求することが可能です。

実行時パーミッションを適切なタイミングで要求できるかどうかで、アプリのユーザー エクスペリエンスが大きく左右されます。パーミッションに関する新たなパーミッション設計ガイドラインには、Google が集めた数多くの設計パターンが含まれています。いつパーミッションを要求するか、パーミッションが必要な理由をどう説明するか、パーミッションが拒否されたらどうするか、などについてのベストプラクティスもその 1 つです。
明らかにパーミッションが必要な場合は事前に要求されます

多くの場合、既存のインテント システムを使ってパーミッションを回避できます。アプリ内でフル エクスペリエンスを構築するのではなく、既存の専門アプリを活用します。例としては、独自のカメラ エクスペリエンスを構築するのではなく、ACTION_IMAGE_CAPTURE を使って、ユーザーが使いなれている既存のカメラ アプリを起動することなどです。詳細については、「パーミッションとインテント」を参照してください。

ただし、実行時パーミッションが必要な場合は、役立つツールが数多くあります。アプリがパーミッションを付与されているかどうかの確認は、ContextCompat.checkSelfPermission()下位互換性確認のために support-v4 ライブラリの改訂 23 の一部が利用可能)で可能です。また、パーミッションの要求は、requestPermissions() を使えば可能です。パーミッションを付与されていない場合には、システム制御パーミッション ダイアログを提示して、ユーザーがパーミッションを付与できるようにします。ユーザーはシステム設定を通じていつでもパーミッションを取り消せるため、パーミッションを毎回常に確認する必要があることを覚えておいてください。

shouldShowRequestPermissionRationale() については、特別に注意する必要があります。「今後このメッセージを表示しない」オプション(パーミッション ダイアログが 2 回目以降に表示されるときに出てくるオプション)を選択していないにもかかわらず、ユーザーがパーミッション要求を少なくとも一度拒否した場合、このメソッドは true を返します。ここで、機能やパーミッションが必要な理由について、ユーザーに説明することができます。詳細については、アプリにパーミッションが必要な理由を参照してください。

設計ガイドラインデベロッパー ガイドを読み、アプリを Android 6.0 と実行時パーミッションに対応させる準備を進めてください。アプリのインストールを簡単にし、ユーザーの情報へのアクセスが必要な理由を説明できれば、より優れたアプリの開発が可能になります。

Posted by Eiji Kitamura - Developer Relations Team