パーミッション リクエストは、デバイスから入手できる機密情報を保護するための仕組みであり、そうした情報へのアクセスがアプリの機能に必要な場合にのみ行うべきものです。このドキュメントでは、機密情報にアクセスすることなく同等またはそれ以上の機能を実現するためのヒントを紹介します。このドキュメントは、Android オペレーティング システムにおけるパーミッションの仕組みについて包括的な説明を提供するものではありません。
Android パーミッションの概要については、パーミッションの概要をご覧ください。コードでの権限の扱い方について詳しくは、アプリの権限をリクエストするをご覧ください。
Android 6.0 以上のパーミッション
Android 6.0 Marshmallow では、アプリがユーザーに対する権限リクエストをインストール前ではなく、ランタイムに実行できる新しい権限モデルが導入されました。この新しいモデルをサポートするアプリは、サービスやサービスによって保護されるデータが実際に必要になったときに権限をリクエストします。これでアプリの全体的な動作が必ずしも変わるわけではありませんが、機密性の高いユーザーデータの取り扱いに関する操作には変化が生じます。
状況に応じた説明の機会が増加: ユーザーには、アプリの実行中に、アプリの中で、こうした権限グループの対象となる機能へのアクセス許可を求めるメッセージが表示されます。ユーザーは権限がリクエストされる状況に強く反応するため、リクエストする権限とアプリの用途が一致しない場合には、その権限をリクエストしている理由についての詳細な説明をユーザーに提供することがさらに重要になります。可能な限り、リクエストの時点で、またユーザーがリクエストを拒否した場合はフォローアップ ダイアログで、リクエストする理由を説明してください。
権限を付与する場合の柔軟性が向上: ユーザーは、権限のリクエスト時や設定で個々の権限へのアクセスを拒否できますが、その結果として機能が動かなくなると慌てる可能性があります。どのくらいのユーザーが権限を許可しないかを(Google アナリティクスなどを使用して)確認し、アプリをリファクタリングしてその権限を使用しないようにするか、アプリが正しく動作するために権限を必要とする理由をより明確に提供することをおすすめします。また、ユーザーが権限リクエストを拒否した場合、または設定で権限をオフに切り替えた場合に生成される例外をアプリが処理できるようにすることも必要です。
トランザクション側の負担が増大: ユーザーには、一括ではなく、個々に権限グループのアクセス許可を求めます。このため、リクエストする権限の数を最小限に抑えることが非常に重要となります。ユーザーが権限を付与する場合の負担が増え、リクエストが拒否される可能性が高くなります。
デフォルト ハンドラとしての設定に必要なパーミッション
アプリによっては、通話履歴や SMS メッセージに関するユーザーの機密情報にアクセスする必要があります。通話履歴や SMS メッセージに固有の権限をリクエストするアプリを Play ストアに公開する場合は、実行時の権限をリクエストする前に、アプリを中核的システム機能のデフォルト ハンドラとして設定することをユーザーに求める必要があります。
デフォルト ハンドラの詳細(デフォルト ハンドラのプロンプトをユーザーに表示する方法など)については、デフォルト ハンドラでのみ使用される権限のガイドをご覧ください。
使用するライブラリを把握する
アプリ内で使用するライブラリに権限が必要となることがあります。たとえば、広告や分析用のライブラリは、必要な機能を実装するために LOCATION
権限グループへのアクセスを必要とする場合があります。ただし、ユーザーの観点からすると、権限をリクエストしているのはアプリであって、ライブラリではありません。
ユーザーは、機能が同じであれば、使用する権限が少ないアプリを選択します。それと同様に、デベロッパーはライブラリを調査して、不要な権限を使用していないサードパーティ SDK を選択する必要があります。たとえば、位置情報機能を提供するライブラリを使用する場合、位置情報ベースのターゲティング機能を使用するのでなければ、FINE_LOCATION
権限をリクエストしないようにします。
位置情報へのバックグラウンド アクセスを制限する
アプリがバックグラウンドで実行されている場合、アプリの中核的機能にとって不可欠な位置情報へのアクセスのみを行い、その明確なメリットをユーザーに示す必要があります。
権限が必要な理由を説明する
requestPermissions()
を呼び出したときにシステムが表示する権限ダイアログでは、アプリが必要とする権限は示されますが、その理由は示されません。ユーザーが困惑することがあります。requestPermissions()
を呼び出す前に、アプリが権限を必要とする理由をユーザーに説明することをおすすめします。
調査によると、ユーザーはアプリに権限が必要な理由を知っていると、権限リクエストを快く受け入れるようになることがわかっています。あるユーザー調査では、次の点が指摘されています。
...ユーザーが特定の権限を特定のモバイルアプリに付与するかどうかは、その権限に関連付けられている目的に大きく左右されます。たとえば、ユーザーが位置情報へのアクセスを快く許可するかどうかは、アプリの中核的機能を実現するためにその権限が必要なのか、それとも広告掲載ネットワークや分析会社に位置情報を提供することが目的なのかによって変わります。1
カーネギー メロン大学の Jason Hong 教授は、共同研究の結果に基づいて次のように結論づけています。
...ターゲット広告の場合など、位置情報のような機密性の高い情報をアプリが使用する場合、その理由を知っていると、アプリが位置情報を使用することを知らされただけのときよりも、ユーザーの信頼感は高まります。1
そのため、権限グループに属する API 呼び出しの一部のみを使用している場合は、使用する権限とその権限を使用する理由の明示的なリストを作成することをおすすめします。次に例を示します。
- 低精度の位置情報のみを使用している場合は、これについて、アプリの説明またはアプリに関するヘルプ記事でユーザーに知らせます。
SMS メッセージを利用して、不正使用からユーザーを保護する認証コードを取得する必要がある場合は、これについて、アプリの説明で、またはデータに最初にアクセスする時点でユーザーに知らせます。
注: アプリが Android 8.0(API レベル 26)以降をターゲットとしている場合は、ユーザーの認証情報を確認する一環として
READ_SMS
権限をリクエストしないでください。代わりに、createAppSpecificSmsToken()
を使用してアプリ固有のトークンを生成し、確認済み SMS メッセージを送信できる別のアプリまたはサービスにそのトークンを渡してください。
特定の状況では、機密性の高いデータへのアクセスをリアルタイムでユーザーに知らせることもおすすめします。たとえば、カメラやマイクにアクセスする場合は、通常、アプリ内の任意の場所に表示される通知アイコンまたは通知トレイ(アプリがバックグラウンドで実行されている場合)を使ってユーザーに知らせることにより、データをひそかに収集しているわけではないことを示すことをおすすめします。
最後に、アプリの機能を動作させるために権限をリクエストする必要があるが、その理由がユーザーに明確ではない場合は、最も機密性の高い権限を必要とする理由をユーザーに知らせる方法を探してください。
両方の権限モデルでテストする
Android 6.0(API レベル 23)以降、ユーザーはアプリのインストール時ではなくアプリの実行時に、権限の付与または取り消しを行うようになりました。そのため、さまざまな条件下でアプリをテストする必要があります。Android 6.0 より前のバージョンでは、アプリが実行されていれば、アプリ マニフェスト内で宣言したすべての権限が付与されていると見なすことができました。Android 6.0 以降では、ユーザーは、すべてのアプリで(API レベル 22 以下をターゲットとするアプリでさえ)権限のオン / オフを切り替えることができます。アプリに権限があるかどうかにかかわらず、アプリが正しく機能していることをテストする必要があります。
次に、API レベル 23 以上を搭載しているデバイスで権限関連のコードの問題を特定する場合に役立つおすすめの方法を紹介します。
- アプリの現在の権限と関連するコードパスを確認します。
- 権限で保護されているサービスやデータでユーザーフローをテストします。
- 付与された権限と取り消された権限のさまざまな組み合わせをテストします。たとえば、カメラアプリのマニフェストに
CAMERA
、READ_CONTACTS
、ACCESS_FINE_LOCATION
がリストされているとします。各権限のオン / オフを切り替えてアプリをテストし、すべての権限構成をアプリが適切に処理できるかどうかを確認します。 - コマンドラインから権限を管理するには、adb ツールを使用します。
- グループごとに権限とステータスをリストする。
$ adb shell pm list permissions -d -g
- 1 つ以上の権限を付与する、または取り消す。
$ adb shell pm [grant|revoke] <permission-name> ...
- グループごとに権限とステータスをリストする。
- アプリで権限を使用しているサービスを分析します。
参考情報
- Android の権限のマテリアル デザイン ガイドライン
- Android Marshmallow 6.0: 権限を求める: この動画では、Android ランタイム権限モデルと、ユーザーに権限を求める適切な方法が説明されています。
- アプリにパーミッションが必要な理由の説明
- 一意の識別子に関するおすすめの方法
参照
[1] Modeling Users’ Mobile App Privacy Preferences: Restoring Usability in a Sea of Permission Settings(J. Lin、B. Liu、N. Sadeh、J. Hong 著。 SOUPS 2014 紀要)