アプリの権限に関するおすすめの設定

権限リクエストは、デバイスから取得できる機密情報を保護するものであり、アプリが機能するために情報にアクセスする必要がある場合にのみ使用してください。このドキュメントは、そのような情報にアクセスせずに同じ(またはより優れた)機能を実現するためのヒントを提供するものであり、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 以上を搭載しているデバイスで権限関連のコードの問題を特定する場合に役立つおすすめの方法を紹介します。

  • アプリの現在の権限と関連するコードパスを確認します。
  • 権限で保護されているサービスやデータでユーザーフローをテストします。
  • 付与された権限と取り消された権限のさまざまな組み合わせをテストします。たとえば、カメラアプリのマニフェストに CAMERAREAD_CONTACTSACCESS_FINE_LOCATION がリストされているとします。各権限のオン / オフを切り替えてアプリをテストし、すべての権限構成をアプリが適切に処理できるかどうかを確認します。
  • コマンドラインから権限を管理するには、adb ツールを使用します。
    • グループごとに権限とステータスを一覧表示します。
      $ adb shell pm list permissions -d -g
    • 1 つ以上の権限を付与または取り消す:
      $ adb shell pm [grant|revoke] <permission-name> ...
  • アプリで権限を使用しているサービスを分析します。

参考情報