権限リクエストを最小限に抑える

アプリの品質を改善し、ユーザーのプライバシーを保護するため、アプリでの権限の使用を最小限に抑えることをおすすめします。これにより、ユーザーは安全なユーザー環境を提供する質の高いアプリを見つけて使用できるようになります。

ユーザーに権限をリクエストするとユーザーフローが中断され、ユーザーがリクエストを拒否する可能性があります。また、新しい権限を宣言するたびに、アプリがユーザーデータをリクエストして共有する方法を確認する必要があります。一部の特に機密性の高い情報に関わる権限と API では、データのアクセス、収集、使用、共有についてアプリ内で開示する必要があります。

権限の使用を最小限に抑えるには、複数の代替方法があります。

  • アプリでおおよその位置情報のみが必要な場合は、正確な位置情報ではなく大まかな位置情報を提供する権限を宣言します。
  • 権限を宣言せずにアプリが目的の機能を実行できるようにする API を呼び出します。
  • 権限を宣言する代わりに、特定のインテントまたはイベント ハンドラを呼び出して機能を実行します。
  • システムには、さまざまなファイル操作に対応する組み込みのコントラクトが用意されています。また、カスタム コントラクトもサポートされています。

権限を宣言する必要がある場合は、常にユーザーの判断を尊重し、アプリのエクスペリエンスのグレースフル デグラデーションを行う方法を提供してください。

このページでは、アプリが権限の必要性を宣言せずに機能を実行できるいくつかのユースケースについて説明します。

付近の場所を表示する

アプリでユーザーのおおよその位置情報を知りたい場合があります。こうした機能は、近くのレストランなどの位置認識情報を表示する場合に役立ちます。

いくつかのユースケースでは、デバイスの位置情報を大まかに推定する必要があります。このような場合は、アプリで位置認識情報が必要になる頻度に応じて、次のいずれかを行います。

  • アプリが頻繁に位置情報を必要とする場合は、ACCESS_COARSE_LOCATION 権限を宣言します。この権限は、おおよその位置情報の精度に関するドキュメントに記載されているように、位置情報サービスから取得されるデバイスの位置情報の推定値を提供します。
  • アプリで位置情報が必要になる頻度が少ない場合や、位置情報が 1 回だけ必要な場合は、代わりに住所や郵便番号の入力をユーザーに求めることを検討してください。

ユースケースによっては、デバイスの位置情報をもっと正確に推定する必要があります。そのような場合にのみ、ACCESS_FINE_LOCATION 権限を宣言できます。

ファイルを作成してアクセスする

Android では、ストレージやセンサーに関連する権限を宣言せずにファイルを作成してアクセスすることができます。

メディア ファイルを開く

アプリでは、メッセージの添付ファイルやプロフィール写真用にユーザーが写真や動画を選択できるようにする場合があります。

この機能をサポートするには、写真選択ツールを使用します。写真選択ツールを使用する際に実行時の権限は必要ありません。ユーザーが写真選択ツールを操作してアプリと共有する写真や動画を選択すると、選択したメディア ファイルに関連付けられた URI への一時的な読み取りアクセス権が付与されます。

アプリが写真選択ツールを使用せずにメディア ファイルにアクセスする必要がある場合、ストレージの権限を宣言する必要はありません。

ドキュメントを開く

アプリは、そのアプリまたは別のアプリでユーザーが作成したドキュメントを表示する場合があります。一般的な例はテキスト ファイルです。

このような場合は、以前のデバイスとの互換性を保つためにのみ READ_EXTERNAL_STORAGE を宣言します。android:maxSdkVersion28 に設定します。

ドキュメントを作成したアプリに応じて、次のいずれかを行います。

写真を撮る

プリインストールされているシステム カメラアプリを使用して、ユーザーがアプリで写真を撮影できる場合があります。

このような場合、CAMERA 権限を宣言しないでください。代わりに、ACTION_IMAGE_CAPTURE インテントのアクションを呼び出します。

動画を撮影する

プリインストールされているシステム カメラアプリを使用して、ユーザーがアプリで動画を撮影できる場合があります。

このような場合、CAMERA 権限を宣言しないでください。代わりに、ACTION_VIDEO_CAPTURE インテントのアクションを呼び出します。

アプリのインスタンスを実行しているデバイスを特定する

アプリの特定のインスタンスで、そのインスタンスを実行しているデバイスを知りたい場合があります。こうした機能は、TV デバイスとウェアラブル デバイスで異なるプレイリストを表示するアプリなど、デバイス固有の設定やメッセージングを使用するアプリで役に立ちます。

このような場合、デバイスの IMEI に直接アクセスしないでください。実際のところ、Android 10 以降では、このアクションは行えません。代わりに、次のいずれかを行います。

  • インスタンス ID ライブラリを使用してアプリのインスタンスの一意のデバイス ID を取得する。
  • アプリのストレージにスコープを限定した独自の ID を作成する。これには randomUUID() などの基本的なシステム関数を使用します。

Bluetooth 経由でデバイスをペア設定する

Bluetooth 経由で別のデバイスにデータを転送すると、アプリのユーザー エクスペリエンスを向上させることができます。

この機能をサポートする場合、ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATIIONBLUETOOTH_ADMIN の各権限を宣言しないでください。代わりに、コンパニオン デバイスのペア設定を使用します。

支払いカード番号を自動的に入力する

Google Play 開発者サービスのライブラリを利用すると、支払いカード番号を自動的に入力できるようになります。CAMERA 権限を宣言する代わりに、デビットカードとクレジット カードの認識ライブラリを使用できます。

通話とテキスト メッセージを管理する

Android と Google Play 開発者サービスのライブラリを利用すると、通話や SMS メッセージに関連する権限を宣言せずに通話やテキスト メッセージを管理できるようになります。

ワンタイム パスコードを自動的に入力する

2 要素認証のワークフローを効率化するため、本人確認を行うためにユーザーのデバイスに送信されるワンタイム パスコードをアプリが自動的に入力する場合があります。

Google Play 開発者サービスを搭載したデバイスでこの機能をサポートする場合、READ_SMS 権限を宣言しないでください。代わりに、SMS Retriever API を使用してください。

それ以外のデバイスでは、アプリが Android 8.0(API レベル 26)以降をターゲットとしている場合、createAppSpecificSmsToken() を使用してアプリ固有のトークンを生成します。確認済み SMS メッセージを送信できる別のアプリまたはサービスにこのトークンを渡します。

ユーザーの電話番号を自動的に入力する

販売やサポートをより効率的にするため、アプリでユーザーがデバイスの電話番号を自動的に入力できるようにする場合があります。

Google Play 開発者サービスを搭載したデバイスでこの機能をサポートする場合、READ_PHONE_STATE 権限を宣言しないでください。代わりに、Phone Number Hint ライブラリを使用してください。

電話の着信をフィルタする

ユーザーの操作への不必要な割り込みを最小限に抑えるために、アプリで迷惑電話をフィルタしたい場合があります。

この機能をサポートする場合、READ_PHONE_STATE 権限を宣言しないでください。代わりに、CallScreeningService API を使用します。

電話をかける

アプリによっては、連絡先の情報をタップして電話をかける機能を備えているものがあります。

この機能をサポートするには、ACTION_CALL アクションではなく、ACTION_DIAL インテントのアクションを使用してください。ACTION_CALL にはインストール時の権限 CALL_PHONE が必要です。これにより、一部のタブレットなどの通話機能のないデバイスでは、アプリをインストールできなくなります。

アプリが中断したときにメディアを一時停止する

ユーザーに電話がかかってきた場合や、ユーザーが設定したアラームが作動した場合、アプリは音声フォーカスを再取得するまでメディア再生を一時停止する必要があります。

この機能をサポートする場合、READ_PHONE_STATE 権限を宣言しないでください。代わりに、onAudioFocusChange() イベント ハンドラを実装します。このハンドラは、システムが音声フォーカスをシフトすると、自動的に実行されます。詳しくは、音声フォーカスを実装する方法をご覧ください。

バーコードをスキャンする

Android には、Google Play 開発者サービスによる Google コードスキャナ API のサポートが含まれています。これにより、カメラの権限を宣言することなく、バーコードをデコードできます。この API を使用すると、ユーザーのプライバシーの保護につながり、バーコード スキャンのユースケース用にカスタム UI を作成することがほぼ必要なくなります。

API がバーコードをスキャンし、スキャン結果のみをアプリに返します。画像はデバイス上で処理され、Google がデータやスキャン結果を保持することはありません。

アプリで複雑なユースケースまたはバーコード形式に対応する必要がある場合、またはカスタム UI が必要な場合は、代わりに ML Kit バーコード スキャン API を使用します。

未使用の権限をリセットする

Android では、未使用の実行時の権限をデフォルトの拒否状態にリセットする方法がいくつかあります。

設計に関するガイダンスをご覧ください。

実行時の権限をリクエストする

アプリで実行時の権限を宣言してリクエストする必要があると判断した場合は、特別なワークフローに沿って行ってください。

設計に関するガイダンスをご覧ください。

アプリに権限が必要な理由を説明する

requestPermissions() を使用すると、アプリで使用する権限を示すダイアログが表示されますが、その理由について説明がないため、ユーザーが困惑する可能性があります。

このダイアログを表示する方法とタイミングに関する詳細と推奨事項については、設計に関するガイダンスをご覧ください。

権限の拒否を処理する

アプリでは権限を拒否した場合の影響について、ユーザーが拒否するかどうかを判断する前と判断した後に、理解できるようにする必要があります。

設計に関するガイダンスをご覧ください。