不変のデバイス ID

Android 6 以降、Wi-Fi サービス プロバイダとパケット アナライザは、ネットワーク リクエストの Wi-Fi スタックを介してデバイスの出荷時 MAC アドレスを取得できなくなっています。Android 10 以降には追加の制限が適用され、特権権限レベルを付与されたアプリがデバイス ID にアクセスすることはできません。これにより、次のようなデバイス ID が保護されます。

  • テレフォニー IMEI 番号、MEID 番号、ESN 番号、IMSI 番号。
  • ビルド、SIM、USB のシリアル番号。

デバイス ID にアクセスできるユーザー

すべての Android 10 デバイスでは、ターゲットが Android 9 以前のアプリであっても、デバイス ID へのアクセスが制限されています。デバイス ID にアクセスできるアプリとユーザーは次のとおりです。

特権パッケージのアクセス

デバイス ID にアクセスするにはパッケージに権限が必要です。Manifest.permission クラスの READ_PRIVILEGED_PHONE_STATE 権限が付与され、privapp-permission.xml ファイルで許可リストに登録されている必要があります。許可リストのプロセスの詳細については、特権の許可リストへの登録をご覧ください。

非特権パッケージの一意の ID を取得する方法については、一般的なユースケースと使用すべき識別子をご覧ください。

制限されたデバイス ID とランダム MAC アドレス

デバイス ID をさらに制限するために、Android 10 を搭載したすべてのデバイスは、プローブおよび関連付けられたリクエストの両方に対してデフォルトでランダム MAC アドレスを送信します。ランダム MAC アドレスは SSID ごとに異なる必要があります。クライアント モード、ソフトウェア アクセス ポイント(AP)、Wi-Fi Direct のユースケースでは、デバイスの出荷時 MAC アドレスを使用しないでください。特権アプリではない一般公開 API に対しては、非表示のままにする必要があります。出荷時の MAC アドレスを返される必要がある特権アプリには、LOCAL_MAC_ADDRESS 権限が必要です。

ユーザーは、各 SSID に割り当てられているデフォルトのランダム MAC アドレスを保持することもできます。 この項目は、[設定] > [ネットワークの詳細] の [プライバシー] で確認できます。ランダム MAC アドレスの取得について詳しくは、ランダム MAC アドレスをご覧ください。

デバイス ID でランダム MAC アドレスがプライバシーに使用されているかどうかが画面に表示される

図 1. [ネットワークの詳細] の [プライバシー] にランダム化された MAC アドレスが表示される。

デバイス ID API を呼び出すアプリ

デバイス ID API を呼び出すアプリは、Android 10 の要件を満たしている必要があります。要件を満たしていない場合、デバイス ID にアクセスしようとすると、次のような結果になります。

  • Android 10 をターゲットとするアプリ
  • Android 9 以前をターゲットとするアプリ
    • READ_PHONE_STATE 権限がある場合は、null レスポンスまたはプレースホルダ データが返されます。
    • この権限がない場合、デバイス ID API は SecurityException をスローして、呼び出されたメソッドの名前と、呼び出し元アプリがリクエスト対象の ID にアクセスするための要件を満たしていないことを示します。

不変のデバイス ID について詳しくは、再設定不可能なデバイス ID一意の ID に関するおすすめの方法をご覧ください。

テスト

デバイスのシリアル番号、該当する場合は IMEI または MEID、SIM のシリアル番号、および登録者 ID にアプリがアクセスできないようにする必要があります。これらの ID にアクセスする権限を持つアプリは、デバイス ID にアクセスできるユーザーに記載された条件のいずれかを満たすことも必要です。