パーミッション リクエストは、デバイスから入手できる機密情報を保護するための仕組みであり、そうした情報へのアクセスがアプリの機能に必要な場合にのみ行うべきものです。このドキュメントでは、機密情報にアクセスすることなく同等またはそれ以上の機能を実現するためのヒントを紹介します。このドキュメントは、Android オペレーティング システムにおけるパーミッションの仕組みについて包括的な説明を提供するものではありません。
Android パーミッションの概要については、パーミッションの概要をご覧ください。コードでの権限の扱い方について詳しくは、アプリの権限をリクエストするをご覧ください。
Android 6.0 以降の権限
Android 6.0(API レベル 23)以降では、アプリは、インストール前ではなく、実行中にユーザーに権限をリクエストできます。これにより、アプリはサービスやそのサービスで保護されているデータを実際に必要とするタイミングで権限をリクエストできるようになります。これでアプリの全体的な動作が必ずしも変わるわけではありませんが、ユーザーの機密情報の取り扱いに関する操作には変化が生じます。
状況に応じた説明の機会が増加
ユーザーには、アプリの実行中に、アプリの中で、こうした権限グループの対象となる機能へのアクセス権限を求めるメッセージが表示されます。ユーザーは権限がリクエストされる状況に強く反応するため、リクエストする権限とアプリの用途が一致しない場合には、その権限をリクエストしている理由についての詳細な説明をユーザーに提供することがさらに重要になります。可能な限り、リクエストの時点で、またユーザーがリクエストを拒否した場合はフォローアップ ダイアログで、リクエストする理由を説明してください。
権限リクエストが承認される可能性を高めるため、特定の機能が必要となる場合にのみメッセージを表示してください。たとえば、ユーザーがマイクのボタンをクリックしたときのみ、マイクへのアクセスを求めるメッセージを表示します。こうすると、必要とする権限をユーザーに許可してもらえる可能性が高くなります。
権限を付与する場合の柔軟性が向上
ユーザーは、権限のリクエスト時や設定で個々の権限へのアクセスを拒否できますが、その結果として機能が動かなくなると慌てる可能性があります。どのくらいのユーザーが権限を許可しないかを(Google アナリティクスなどを使用して)確認し、アプリをリファクタリングしてその権限を使用しないようにするか、アプリが正しく動作するために権限を必要とする理由をより明確に提供することをおすすめします。また、ユーザーが権限リクエストを拒否した場合、または設定で権限をオフに切り替えた場合に例外をアプリが処理できるようにすることも必要です。
トランザクション側の負担が増大
ユーザーには、一括ではなく、個々に権限グループのアクセス許可を求めます。このため、リクエストする権限の数を最小限に抑えることが非常に重要となります。この数が多いと、ユーザーが権限を付与する場合の負担が増え、リクエストが拒否される可能性が高くなります。
デフォルト ハンドラとしての設定に必要な権限
アプリによっては、通話履歴や SMS メッセージに関するユーザーの機密情報にアクセスする必要があります。通話履歴や SMS メッセージにのみ使用される権限をリクエストするアプリを Play ストアに公開する場合は、実行時の権限をリクエストする前に、アプリを中核的システム機能のデフォルト ハンドラとして設定することをユーザーに求める必要があります。
デフォルト ハンドラの詳細(デフォルト ハンドラのプロンプトをユーザーに表示する方法など)については、デフォルト ハンドラでのみ使用される権限のガイドをご覧ください。
使用するライブラリを把握する
アプリ内で使用するライブラリに権限が必要となることがあります。たとえば、広告や分析用のライブラリは、必要な機能を実装するために LOCATION
権限グループへのアクセスを必要とする場合があります。ただし、ユーザーの観点からすると、権限をリクエストしているのはアプリであって、ライブラリではありません。
ユーザーは、機能が同じであれば、使用する権限が少ないアプリを選択します。それと同様に、デベロッパーはライブラリを調査して、不要な権限を使用していないサードパーティ SDK を選択する必要があります。たとえば、位置情報機能を提供するライブラリを使用する場合、位置情報ベースのターゲティング機能を使用するのでなければ、FINE_LOCATION
権限をリクエストしないようにします。
位置情報へのバックグラウンド アクセスを制限する
アプリがバックグラウンドで実行されている場合、アプリのコア機能にとって不可欠な位置情報へのアクセスのみを行い、その明確なメリットをユーザーに示す必要があります。
両方の権限モデルでテストする
Android 6.0(API レベル 23)以降、ユーザーはアプリのインストール時ではなく、実行時にアプリの権限の付与や取り消しを行うようになりました。そのため、さまざまな条件下でアプリをテストする必要があります。Android 6.0 より前のバージョンでは、アプリが実行されていれば、アプリ マニフェスト内で宣言したすべての権限が付与されていると見なすことができました。現在は、ユーザーは、API レベルにかかわらず、どのアプリでも権限のオン / オフを切り替えることができるため、さまざまな権限シナリオでアプリが正しく機能することをテストする必要があります。
次に、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 ランタイム権限モデルと、ユーザーに権限を求める適切な方法が説明されています。
- アプリにパーミッションが必要な理由の説明
- 一意の識別子に関するおすすめの方法