在 Android 6 及更高版本中,Wi-Fi 服务提供方和数据包分析器已无法再使用 Wi-Fi 堆栈通过网络请求检索设备的出厂 MAC 地址。从 Android 10 开始,系统增加了更多限制,只允许具有特权权限级别的应用访问设备标识符 (ID)。这样可保护各种设备 ID,例如:
- 电话 IMEI、MEID、ESN 和 IMSI 号码。
- build 号、SIM 卡号或 USB 序列号。
谁能访问设备 ID
对设备 ID 的访问在所有 Android 10 设备上都受限,即使应用以 Android 9 或更低版本为目标平台也不例外。可以通过以下方式访问设备 ID:
- 默认的短信应用。
- 既在
Manifest.permission
类中具有READ_PRIVILEGED_PHONE_STATE
权限又在privapp-permission.xml
文件中列入许可名单的应用。这些应用还必须加载到priv-app
目录中。 - 具有 UICC 运营商权限中定义的运营商权限的应用。
- 在
Manifest.permission
类中被授予READ_PHONE_STATE
权限的设备所有者或资料所有者(无需列入许可名单。)
特权软件包访问权限
软件包必须具有特权才能访问设备 ID。它必须在 Manifest.permission
类中具有
READ_PRIVILEGED_PHONE_STATE
权限,且在 privapp-permission.xml
文件中列入了许可名单。如需了解许可名单流程,请参阅特许权限许可名单。
如需了解如何获取非特权软件包的唯一 ID,请参阅常见用例和适用的标识符。
受限设备 ID 和随机分配的 MAC 地址
为了进一步限制设备 ID,搭载 Android 10 的所有设备默认都会为探测请求和相关请求传输随机分配的 MAC 地址,并且必须为每个 SSID 提供不同的随机分配 MAC 地址。请勿在客户端模式、软接入点 (AP) 或 Wi-Fi 直连用例中使用设备的出厂 MAC 地址。它不允许提供给不是特权应用且可公开访问的 API。需要返回出厂 MAC 地址的特权应用必须具有 LOCAL_MAC_ADDRESS
权限。
用户可以选择保留分配给每个 SSID 的默认随机分配 MAC 地址。可以在设置 > 网络详情中的隐私权下查看该选项。如需了解如何获取随机分配的 MAC 地址,请参阅随机分配的 MAC 地址。
调用设备 ID API 的应用
调用设备 ID API 的应用必须满足 Android 10 的要求。否则,当它们尝试访问设备 ID 时,将返回以下内容:
- 以 Android 10 为目标平台的应用
- 设备 ID API 会抛出
SecurityException
。 - 以 Android 9 或更低版本为目标平台的应用
- 如果它们具有
READ_PHONE_STATE
权限,则会返回null
响应或占位符数据。 - 如果不具有该权限,设备 ID API 便会抛出
SecurityException
,其中包含所调用的方法的名称,以及一条提示,指示发起调用的应用因不符合要求而无法访问所请求的 ID。
如需详细了解不可变的设备 ID,请参阅不可重置的设备标识符和唯一标识符最佳做法。
测试
必须阻止应用访问设备序列号,在适用的情况下,也要阻止应用访问 IMEI/MEID、SIM 卡序列号和订阅者 ID。有权访问这些 ID 的应用还必须满足谁能访问设备 ID 部分列出的条件之一。