Android 10(API レベル 29)では、ユーザーのプライバシーをより適切に保護するために、さまざまな機能と動作変更が導入されています。これらの変更により、ユーザーが自身のデータとアプリに付与する機能をより明確に把握し、管理できるようになります。これらの機能により、アプリが依存している特定の動作やデータが、以前のバージョンのプラットフォームとは異なる動作をする可能性があります。アプリがユーザーデータの取り扱いに関する現在のベスト プラクティスに沿っている場合、アプリへの影響は最小限に抑えられます。
このページでは各変更の概要を説明します。
主な変更点
このセクションでは、プライバシーに関連する Android 10 の主な変更点について説明します。
アプリのファイルとメディアを対象とする外部ストレージ アクセス
デフォルトでは、Android 10 以降をターゲットとするアプリには、外部ストレージに対する対象範囲別アクセス権(対象範囲別ストレージ)が付与されます。このようなアプリは、ストレージ関連のユーザー権限をリクエストすることなく、外部ストレージ デバイス内の次の種類のファイルを表示できます。
- アプリ固有のディレクトリ内のファイル。
getExternalFilesDir()を使用してアクセスします。 - アプリによってメディアストアから作成された写真、動画、音声クリップ。
対象範囲別ストレージの詳細、および外部ストレージ デバイスに保存されているファイルを共有、アクセス、変更する方法については、外部ストレージ内のファイルを管理する方法とメディア ファイルにアクセスして変更する方法に関するガイドをご覧ください。
デバイスの位置情報へのバックグラウンドでのアクセスに必要な権限
アプリの位置情報へのアクセスをユーザーがより細かく制御できるように、Android 10 では ACCESS_BACKGROUND_LOCATION 権限が導入されています。
ACCESS_FINE_LOCATION 権限や ACCESS_COARSE_LOCATION 権限とは異なり、ACCESS_BACKGROUND_LOCATION 権限は、アプリがバックグラウンドで実行されている場合の位置情報へのアクセスにのみ影響します。次のいずれかの条件を満たしていない場合、アプリはバックグラウンドで位置情報にアクセスしているとみなされます。
- 対象アプリに属するアクティビティが表示されている。
アプリが、
locationのフォアグラウンド サービス タイプを宣言したフォアグラウンド サービスを実行している。アプリ内のサービスのフォアグラウンド サービス タイプを宣言するには、アプリの
targetSdkVersionまたはcompileSdkVersionを29以上に設定します。フォアグラウンド サービスが位置情報へのアクセスを必要とするユーザー開始アクションを続行する方法の詳細。
アプリがジオフェンスを作成してモニタリングし、Android 10(API レベル 29)以降をターゲットとする場合は、ACCESS_BACKGROUND_LOCATION 権限を宣言する必要があります。
Android 9 以前をターゲットとするときに自動的に許可されるアクセス
アプリが Android 10 以降で動作するものの、Android 9(API レベル 28)以前をターゲットとしている場合、プラットフォームは次の動作を適用します。
- アプリで
ACCESS_FINE_LOCATIONまたはACCESS_COARSE_LOCATIONの<uses-permission>要素を宣言している場合、システムはインストール時にACCESS_BACKGROUND_LOCATIONの<uses-permission>要素を自動的に追加します。 - アプリが
ACCESS_FINE_LOCATIONまたはACCESS_COARSE_LOCATIONのいずれかをリクエストした場合、そのリクエストに対してACCESS_BACKGROUND_LOCATIONが自動的に追加されます。
デバイスが Android 10 にアップグレードされたときのアクセス
ユーザーがアプリにデバイスの位置情報(ACCESS_COARSE_LOCATION または ACCESS_FINE_LOCATION)へのアクセスを許可した後、デバイスを Android 9 から Android 10 にアップグレードすると、アプリに付与されている位置情報に基づく権限のセットが自動的に更新されます。アップグレード後にアプリが受け取る権限のセットは、次の表に示すように、ターゲット SDK バージョンと定義されている権限によって異なります。
表 1. デバイスを Android 10 にアップグレードした後の位置情報の利用許可の状態の変化
| ターゲット プラットフォームのバージョン | おおまかな位置情報または正確な位置情報の 権限が付与されているか |
バックグラウンド権限が マニフェストで定義されているか? |
更新されたデフォルトのアクセス権限の状態 |
|---|---|---|---|
| Android 10 | ○ | ○ | フォアグラウンドとバックグラウンドでのアクセス権限 |
| Android 10 | ○ | × | フォアグラウンドでのアクセス権限のみ |
| Android 10 | × | (システムによって無視される) | アクセス権限なし |
| Android 9 以前 | ○ | デバイスのアップグレード時に自動的に追加される | フォアグラウンドとバックグラウンドでのアクセス権限 |
| Android 9 以前 | × | (システムによって無視される) | アクセス権なし |
システムがデバイスの位置情報へのアプリのアクセスを自動的に更新した後でも、ユーザーはこのアクセスレベルを変更できます。たとえば、ユーザーがアプリのアクセスをフォアグラウンドのみに制限したり、アクセスを完全に無効にしたりする可能性があります。デバイスの位置情報にアクセスする前に、特にフォアグラウンド サービス内で、アプリはユーザーがアプリにこの位置情報の受信を許可しているかどうかを確認する必要があります。
Android 10 デバイスで対象 API レベルを更新するとアクセスが取り消される
Android 10 を搭載したデバイスにアプリがすでにインストールされている場合を考えてみましょう。この状況で Android 10 をターゲットとするようにアプリを更新すると、デバイスは ACCESS_BACKGROUND_LOCATION 権限を取り消します。
アプリがバックグラウンドで動作しているときにデバイスの位置情報を取得する方法について詳しくは、位置情報の更新データを定期的に受信するをご覧ください。
バックグラウンドからのアクティビティの起動に関する制限
Android 10 以降では、バックグラウンドからのアクティビティの起動に関する制限が適用されます。この動作変更により、ユーザーの操作が中断されることが最小限に抑えられ、ユーザーは画面に表示される内容をより細かく制御できるようになります。ユーザー操作の直接的な結果としてアプリがアクティビティを開始する限り、アプリがこれらの制限の影響を受ける可能性はほとんどありません。
バックグラウンドからアクティビティを開始する代わりに推奨される方法について詳しくは、アプリで時間的制約のあるイベントをユーザーに通知する方法に関するガイドをご覧ください。
ID とデータ
このセクションでは、デバイス ID とデータの操作に固有の変更について説明します。
連絡先アフィニティの削除
Android 10 以降、プラットフォームは連絡先アフィニティ情報を追跡しません。そのため、アプリがユーザーの連絡先を検索しても、結果はインタラクションの頻度順に並べ替えられません。
ContactsProvider に関するガイドには、Android 10 以降のすべてのデバイスで廃止されたフィールドとメソッドを説明する通知が含まれています。
MAC アドレスのランダム化
Android 10 以降を搭載したデバイスでは、システムはデフォルトでランダム化された MAC アドレスを送信します。
アプリがエンタープライズ ユースケースを処理する場合、プラットフォームは MAC アドレスに関連するいくつかのオペレーション用の API を提供します。
- ランダム MAC アドレスを取得する: デバイス所有者アプリとプロファイル所有者アプリは、
getRandomizedMacAddress()を呼び出すことで、特定のネットワークに割り当てられたランダム MAC アドレスを取得できます。 - 出荷時の実際の MAC アドレスを取得する: デバイス所有者アプリは、
getWifiMacAddress()を呼び出すことで、デバイスの実際のハードウェア MAC アドレスを取得できます。このメソッドは、大量のデバイスをトラッキングする際に便利です。
/proc/net ファイル システムへのアクセスに関する制限
Android 10 以降を搭載したデバイスでは、アプリは /proc/net にアクセスできません。これには、デバイスのネットワーク状態に関する情報が含まれます。この情報にアクセスする必要があるアプリ(VPN など)は、NetworkStatsManager クラスまたは ConnectivityManager クラスを使用する必要があります。
再設定不可能なデバイス ID に関する制限
Android 10 以降、アプリがデバイスのリセットできない識別子(IMEI とシリアル番号の両方を含む)にアクセスするには、READ_PRIVILEGED_PHONE_STATE 特権が必要です。
影響を受けるメソッドは次のとおりです。
BuildTelephonyManager
アプリに権限がなく、リセット不可能な識別子に関する情報をリクエストしようとすると、プラットフォームのレスポンスはターゲット SDK バージョンによって異なります。
- アプリが Android 10 以降をターゲットとしている場合は、
SecurityExceptionが発生します。 - アプリが Android 9(API レベル 28)以前をターゲットとしている場合、アプリに
READ_PHONE_STATE権限があれば、このメソッドはnullまたはプレースホルダ データを返します。それ以外の場合は、SecurityExceptionが発生します。
多くのユースケースでは、再設定不可能なデバイス ID は不要です。たとえば、アプリで広告トラッキングやユーザー分析のためにリセット不可能なデバイス識別子を使用している場合は、代わりに Android 広告 ID を使用します。詳しくは、固有識別子に関するベスト プラクティスをご覧ください。
クリップボード データへの制限付きアクセス
アプリがデフォルトのインプット メソッド エディタ(IME)であるか、現在フォーカスされているアプリである場合を除き、Android 10 以降ではクリップボード データにアクセスできません。
USB デバイスのシリアル番号の保護
Android 10 以降をターゲットとするアプリの場合、ユーザーが USB デバイスまたはアクセサリーへのアクセス権をアプリに付与するまで、アプリはシリアル番号を読み取ることができません。
USB デバイスの操作について詳しくは、USB ホストを構成する方法についてのガイドをご覧ください。
カメラと接続
このセクションでは、カメラ メタデータと接続 API に固有の変更点について説明します。
カメラの詳細とメタデータへのアクセスに関する制限
Android 10 では、getCameraCharacteristics() メソッドがデフォルトで返す情報の範囲が変更されています。特に、このメソッドの戻り値に含まれるデバイス固有のメタデータにアクセスするには、アプリに CAMERA 権限が必要です。
これらの変更について詳しくは、権限が必要なカメラ フィールドに関するセクションをご覧ください。
Wi-Fi の有効化 / 無効化に関する制限
Android 10 以降をターゲットとするアプリは、Wi-Fi を有効または無効にできません。WifiManager.setWifiEnabled() メソッドは常に false を返します。
Wi-Fi の有効化と無効化をユーザーに求める必要がある場合は、設定パネルを使用します。
設定済み Wi-Fi ネットワークへの直接アクセスに関する制限
ユーザーのプライバシーを保護するため、Wi-Fi ネットワークのリストの手動設定は、システムアプリと Device Policy Controller(DPC)に制限されています。特定の DPC は、デバイス所有者またはプロファイル所有者のいずれかになります。
アプリが Android 10 以降をターゲットとしており、システムアプリでも DPC でもない場合、次のメソッドは有用なデータを返しません。
getConfiguredNetworks()メソッドは常に空のリストを返します。整数値を返す各ネットワーク オペレーション メソッド(
addNetwork()とupdateNetwork())は、常に -1 を返します。ブール値を返す各ネットワーク オペレーション(
removeNetwork()、reassociate()、enableNetwork()、disableNetwork()、reconnect()、disconnect())は、常にfalseを返します。
アプリを Wi-Fi ネットワークに接続する必要がある場合は、次の代替方法を使用します。
- Wi-Fi ネットワークへのインスタント ローカル接続をトリガーするには、標準の
NetworkRequestオブジェクトでWifiNetworkSpecifierを使用します。 - ユーザーにインターネット アクセスを提供するために考慮する Wi-Fi ネットワークを追加するには、
WifiNetworkSuggestionオブジェクトを使用します。自動接続ネットワーク選択ダイアログに表示されるネットワークを追加または削除するには、それぞれaddNetworkSuggestions()とremoveNetworkSuggestions()を呼び出します。この 2 つのメソッドは、位置情報の利用許可を必要としません。
一部の電話、Bluetooth、Wi-Fi API に FINE 位置情報の利用許可が必要
Android 10 以上をターゲットとするアプリの場合、Wi-Fi、Wi-Fi Aware、Bluetooth の API 内のいくつかのメソッドを使用するには、ACCESS_FINE_LOCATION 権限が必要です。以降のセクションでは、影響を受けるクラスとメソッドを一覧表示します。
電話
TelephonyManagergetCellLocation()getAllCellInfo()requestNetworkScan()requestCellInfoUpdate()getAvailableNetworks()getServiceState()
TelephonyScanManagerrequestNetworkScan()
TelephonyScanManager.NetworkScanCallbackonResults()
PhoneStateListeneronCellLocationChanged()onCellInfoChanged()onServiceStateChanged()
Wi-Fi
WifiManagerstartScan()getScanResults()getConnectionInfo()getConfiguredNetworks()
WifiAwareManagerWifiP2pManagerWifiRttManager
Bluetooth
BluetoothAdapterstartDiscovery()startLeScan()
BluetoothAdapter.LeScanCallbackBluetoothLeScannerstartScan()
権限
このセクションでは、Android 権限モデルのアップデートについて説明します。
画面コンテンツに対するアクセスの制限
Android 10 では、ユーザーの画面コンテンツを保護するため、READ_FRAME_BUFFER、CAPTURE_VIDEO_OUTPUT、CAPTURE_SECURE_VIDEO_OUTPUT 権限のスコープを変更することで、デバイスの画面コンテンツへのサイレント アクセスを防止しています。Android 10 以降、これらの権限は署名アクセスのみです。
デバイスの画面コンテンツにアクセスする必要があるアプリは、MediaProjection API を使用する必要があります。この API は、ユーザーに同意を求めるプロンプトを表示します。
旧式アプリに関するユーザー向けアクセス権限チェック
アプリが Android 5.1(API レベル 22)以下を対象としている場合、Android 10 以降を搭載したデバイスでアプリを初めて使用するときに、図 1 に示すように権限画面が表示されます。この画面では、インストール時にシステムによってアプリに付与された権限へのアクセスを取り消すことができます。
運動認識
Android 10 では、ユーザーの歩数を検出したり、徒歩、サイクリング、乗り物での移動など、ユーザーの身体活動を分類したりする必要があるアプリ向けに android.permission.ACTIVITY_RECOGNITION 実行時の権限が導入されています。このアクセス権限は、デバイスのセンサーデータが [設定] 内でどのように使用されているのかをユーザーに表示するように設計されています。
Google Play 開発者サービス内の一部のライブラリ(Activity Recognition API や Google Fit API など)は、ユーザーがアプリにこの権限を付与していない限り、結果を提供しません。
この権限を宣言する必要があるデバイスの組み込みセンサーは、歩数計センサーと歩数検出センサーのみです。
Android 9(API レベル 28)以下をターゲットとするアプリの場合、アプリが次の条件をすべて満たしていれば、必要に応じて android.permission.ACTIVITY_RECOGNITION 権限が自動的に付与されます。
- マニフェスト ファイルには
com.google.android.gms.permission.ACTIVITY_RECOGNITION権限が含まれます。 - マニフェスト ファイルには
android.permission.ACTIVITY_RECOGNITION権限は含まれません。
システムが android.permission.ACTIVITY_RECOGNITION 権限を自動的に付与した場合、Android 10 をターゲットとするようにアプリを更新した後も、アプリはその権限を保持します。ただし、ユーザーはシステム設定でいつでもこの権限を取り消すことができます。
UI から削除された権限グループ
Android 10 以降、アプリは UI で権限がどのようにグループ化されているかを検索できません。