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 9(API レベル 28)以前をターゲットとしているアプリが Android 10 以降で実行されている場合、プラットフォームでは次の動作が適用されます。
- アプリが
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 バージョンと定義済みの権限によって異なります。
ターゲット プラットフォームのバージョン | 粗い位置情報と正確な位置情報のどちらの 権限が付与されているか |
バックグラウンドでのアクセス権限がマニフェストで定義されている |
更新されたデフォルトのアクセス権限の状態 |
---|---|---|---|
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 とシリアル番号の両方を含む再設定不可能なデバイス ID にアクセスするには、アプリに READ_PRIVILEGED_PHONE_STATE
特権が必要です。
影響を受けるメソッドは次のとおりです。
Build
TelephonyManager
権限を持たないアプリが再設定不可能な ID に関する情報を求めようとした場合、プラットフォームの応答はターゲット SDK のバージョンによって異なります。
- アプリが Android 10 以降を対象にしている場合、
SecurityException
が発生します。 - アプリが Android 9(API レベル 28)以前を対象にしている場合、アプリに
READ_PHONE_STATE
権限があれば、このメソッドはnull
またはプレースホルダ データを返します。それ以外の場合は、SecurityException
が発生します。
多くのユースケースでは、再設定不可能なデバイス ID は不要です。たとえば、アプリが広告トラッキングやユーザー分析の目的で再設定不可能なデバイス ID を使用している場合は、そのような特定のユースケースには代わりに Android 広告 ID を使用します。詳しくは、一意の識別子に関するベスト プラクティスをご覧ください。
クリップボード データへの制限付きアクセス
デフォルトのインプット メソッド エディタ(IME)のアプリであるか、現在フォーカスされているアプリでない限り、Android 10 以降ではクリップボード データにアクセスできません。
USB デバイスのシリアル番号の保護
Android 10 以降をターゲットとしているアプリの場合、ユーザーがアプリに対して USB デバイスや 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 API、Wi-Fi Aware API、Bluetooth API 内の以下のメソッドを使用するには、ACCESS_FINE_LOCATION
権限が必要です。以降のセクションでは、影響を受けるクラスとメソッドを示します。
電話
TelephonyManager
getCellLocation()
getAllCellInfo()
requestNetworkScan()
requestCellInfoUpdate()
getAvailableNetworks()
getServiceState()
TelephonyScanManager
requestNetworkScan()
TelephonyScanManager.NetworkScanCallback
onResults()
PhoneStateListener
onCellLocationChanged()
onCellInfoChanged()
onServiceStateChanged()
Wi-Fi
WifiManager
startScan()
getScanResults()
getConnectionInfo()
getConfiguredNetworks()
WifiAwareManager
WifiP2pManager
WifiRttManager
Bluetooth
BluetoothAdapter
startDiscovery()
startLeScan()
BluetoothAdapter.LeScanCallback
BluetoothLeScanner
startScan()
権限
このセクションでは、Android 権限モデルのアップデートについて説明します。
画面コンテンツに対するアクセスの制限
ユーザーの画面コンテンツを保護するため、Android 10 では READ_FRAME_BUFFER
、CAPTURE_VIDEO_OUTPUT
、CAPTURE_SECURE_VIDEO_OUTPUT
の各権限の範囲を変更することで、デバイスの画面コンテンツへのサイレント アクセスを防止します。Android 10 の時点で、これらの権限は signature アクセス専用です。
デバイスの画面コンテンツにアクセスする必要があるアプリは、MediaProjection
API を使用して、ユーザーに同意を求めるプロンプトを表示する必要があります。
旧式アプリに関するユーザー向けアクセス権限チェック
Android 5.1(API レベル 22)以前をターゲットとしている場合、Android 10 以降を実行するデバイスで初めてそのアプリを使用するとき、ユーザーにはアクセス権限を求める画面が表示されます(図 1 を参照)。この画面では、以前のインストール時にシステムがアプリに付与していたアクセス権限を取り消すことができます。
運動認識
Android 10 では、ユーザーの歩数を検出したり、徒歩、サイクリング、車の運転など、ユーザーの運動を分類したりする必要があるアプリ向けに android.permission.ACTIVITY_RECOGNITION
ランタイム権限が導入されています。このアクセス権限は、デバイスのセンサーデータが [設定] 内でどのように使用されているのかをユーザーに表示するように設計されています。
Activity Recognition API や Google Fit API など、Google Play 開発者サービス内のライブラリの中には、ユーザーがアプリに対してこの権限を付与していない限り結果を提供しないものがあります。
デバイス上の組み込みセンサーのうち、この権限の宣言を求めるのは、歩数計と歩行検出のセンサーのみです。
アプリが 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 内で権限がどのようにグループ化されているかをアプリでは検索できません。