アプリで権限を宣言する前に、その必要があるかどうかを検討します。権限を宣言すると、実行時の権限を必要とするアプリ機能をユーザーが実行しようとするたびに、アプリが権限リクエストでユーザーの操作を中断することになります。そのたびに、ユーザーは権限を付与するかどうかを決定しなければなりません。ユーザーは、アプリが特定の権限をリクエストする理由を理解できない場合、権限の付与を拒否することや、アプリをアンインストールすることさえあり得ます。
また、新しい権限を宣言するたびに、アプリがユーザーデータをリクエストして共有する方法を確認する必要があります。一部の特に機密性の高い情報に関わる権限と API では、データのアクセス、収集、使用、共有についてアプリ内で開示する必要があります。
そもそも権限が必要かどうか、あるいは、アプリでその機能をサポートするための別の方法があるかどうかを検討してください。システムには、さまざまなファイル オペレーションに対応する組み込みのコントラクトが用意されています。また、カスタム コントラクトもサポートされています。
権限を宣言する必要がある場合は、常にユーザーの判断を尊重し、アプリのエクスペリエンスのグレースフル デグラデーションを行う方法を提供してください。
このページでは、アプリが権限の必要性を宣言せずに機能を実行できるいくつかのユースケースについて説明します。
付近の場所を表示する
アプリでユーザーのおおよその位置情報を知りたい場合があります。こうした機能は、近くのレストランなどの位置認識情報を表示する場合に役立ちます。
いくつかのユースケースでは、デバイスの位置情報を大まかに推定する必要があります。このような場合は、アプリで位置認識情報が必要になる頻度に応じて、次のいずれかを行います。
- アプリが頻繁に位置情報を必要とする場合は、
ACCESS_COARSE_LOCATION
権限を宣言します。この権限は、おおよその位置情報の精度に関するドキュメントに記載されているように、位置情報サービスから取得されるデバイスの位置情報の推定値を提供します。 - アプリで位置情報が必要になる頻度が少ない場合や、位置情報が 1 回だけ必要な場合は、代わりに住所や郵便番号の入力をユーザーに求めることを検討してください。
ユースケースによっては、デバイスの位置情報をもっと正確に推定する必要があります。そのような場合にのみ、ACCESS_FINE_LOCATION
権限を宣言できます。
ファイルを作成してアクセスする
Android では、ストレージやセンサーに関連する権限を宣言せずにファイルを作成してアクセスすることができます。
写真を撮る
プリインストールされているシステム カメラアプリを使用して、ユーザーがアプリで写真を撮影できる場合があります。
このような場合、CAMERA
権限を宣言しないでください。代わりに、ACTION_IMAGE_CAPTURE
インテントのアクションを呼び出します。
動画を撮影する
プリインストールされているシステム カメラアプリを使用して、ユーザーがアプリで動画を撮影できる場合があります。
このような場合、CAMERA
権限を宣言しないでください。代わりに、ACTION_VIDEO_CAPTURE
インテントのアクションを呼び出します。
メディア ファイルを開く
アプリでは、メッセージの添付ファイルやプロフィール写真用にユーザーが写真や動画を選択できるようにする場合があります。
この機能をサポートするには、写真選択ツールを使用します。写真選択ツールを使用する際に実行時の権限は必要ありません。ユーザーが写真選択ツールを操作してアプリと共有する写真や動画を選択すると、選択したメディア ファイルに関連付けられた URI への一時的な読み取りアクセス権が付与されます。
アプリが写真選択ツールを使用せずにメディア ファイルにアクセスする必要がある場合、ストレージの権限を宣言する必要はありません。
- アプリが作成したメディア ファイルにアクセスする場合、アプリはすでに、メディアストア内でこれらのファイルにアクセスできるようになっています。
- 他のアプリが作成したメディア ファイルにアクセスする場合は、ストレージ アクセス フレームワークを使用します。
ドキュメントを開く
アプリは、そのアプリまたは別のアプリでユーザーが作成したドキュメントを表示する場合があります。一般的な例はテキスト ファイルです。
このような場合は、以前のデバイスとの互換性を保つためにのみ READ_EXTERNAL_STORAGE
を宣言します。android:maxSdkVersion
を 28
に設定します。
ドキュメントを作成したアプリに応じて、次のいずれかを行います。
- ユーザーがアプリでドキュメントを作成した場合は、直接アクセスします。
- ユーザーが別のアプリでドキュメントを作成した場合は、ストレージ アクセス フレームワークを使用します。
アプリのインスタンスを実行しているデバイスを特定する
アプリの特定のインスタンスで、そのインスタンスを実行しているデバイスを知りたい場合があります。こうした機能は、TV デバイスとウェアラブル デバイスで異なるプレイリストを表示するアプリなど、デバイス固有の設定やメッセージングを使用するアプリで役に立ちます。
このような場合、デバイスの IMEI に直接アクセスしないでください。実際のところ、Android 10 以降では、このアクションは行えません。代わりに、次のいずれかを行います。
- インスタンス ID ライブラリを使用してアプリのインスタンスの一意のデバイス ID を取得する。
- アプリのストレージにスコープを限定した独自の ID を作成する。これには
randomUUID()
などの基本的なシステム関数を使用します。
Bluetooth 経由でデバイスをペア設定する
Bluetooth 経由で別のデバイスにデータを転送すると、アプリのユーザー エクスペリエンスを向上させることができます。
この機能をサポートする場合、ACCESS_FINE_LOCATION
、ACCESS_COARSE_LOCATIION
、BLUETOOTH_ADMIN
の各権限を宣言しないでください。代わりに、コンパニオン デバイスのペア設定を使用します。
支払いカード番号を自動的に入力する
Google Play 開発者サービスのライブラリを利用すると、支払いカード番号を自動的に入力できるようになります。CAMERA
権限を宣言する代わりに、デビットカードとクレジット カードの認識ライブラリを使用できます。
アプリが中断したときにメディアを一時停止する
ユーザーに電話がかかってきた場合や、ユーザーが設定したアラームが作動した場合、アプリは音声フォーカスを再取得するまでメディア再生を一時停止する必要があります。
この機能をサポートする場合、READ_PHONE_STATE
権限を宣言しないでください。代わりに、onAudioFocusChange()
イベント ハンドラを実装します。このハンドラは、システムが音声フォーカスをシフトすると、自動的に実行されます。詳しくは、音声フォーカスを実装する方法をご覧ください。
通話とテキスト メッセージを管理する
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
が必要です。これにより、一部のタブレットなどの通話機能のないデバイスでは、アプリをインストールできなくなります。