Android 10 中的隐私变更

Android 10(API 级别 29)引入了多项功能和行为变更,以更好地保护用户隐私。这些变更扩展了用户对其数据以及授予应用能力的透明度和控制权。这些功能可能意味着您的应用所依赖的特定行为或数据与旧版平台相比可能会表现不同。如果您的应用遵循当前处理用户数据的最佳实践,则对您的应用影响应微乎其微。

本页面汇总了各项变更。

主要变更

本部分包含 Android 10 中与隐私相关的主要变更。

外部存储访问权限限定为应用文件和媒体

默认情况下,面向 Android 10 及更高版本的应用被授予外部存储的限定访问权限,即限定存储空间。此类应用无需请求任何与存储相关的用户权限即可在外部存储设备中查看以下类型的文件

要详细了解限定存储空间,以及如何共享、访问和修改保存在外部存储设备上的文件,请参阅有关如何管理外部存储中的文件访问和修改媒体文件的指南。

后台访问设备位置需要权限

为了支持用户对应用访问位置信息的额外控制,Android 10 引入了 ACCESS_BACKGROUND_LOCATION 权限。

ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION 权限不同,ACCESS_BACKGROUND_LOCATION 权限仅影响应用在后台运行时对位置的访问。除非满足以下条件之一,否则应用被视为在后台访问位置:

  • 应用的某项 activity 可见。
  • 应用正在运行已声明前台服务类型location 的前台服务。

    要声明应用中服务的前台服务类型,请将应用的 targetSdkVersioncompileSdkVersion 设置为 29 或更高。了解有关前台服务如何继续需要访问位置的用户发起的操作的更多信息。

如果您的应用创建并监控地理围栏,并且面向 Android 10(API 级别 29)或更高版本,则必须声明 ACCESS_BACKGROUND_LOCATION 权限。

面向 Android 9 或更低版本时自动授予访问权限

如果您的应用在 Android 10 或更高版本上运行,但面向 Android 9(API 级别 28)或更低版本,则平台将应用以下行为:

  • 如果您的应用为 ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION 声明了 <uses-permission> 元素,则系统会在安装期间自动添加一个 ACCESS_BACKGROUND_LOCATION<uses-permission> 元素。
  • 如果您的应用请求 ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION,则系统会自动将 ACCESS_BACKGROUND_LOCATION 添加到请求中。

设备升级到 Android 10 后的访问权限

如果用户授予您的应用设备位置访问权限(ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION),然后将设备从 Android 9 升级到 Android 10,则系统会自动更新授予您的应用的位置相关权限集。应用在升级后获得的权限集取决于其目标 SDK 版本和定义的权限,如以下表格所示:

表 1. 设备升级到 Android 10 后位置权限状态的变更

目标平台版本 粗略或精确
是否授予权限?
后台权限
是否在 manifest 中定义?
更新后的默认权限状态
Android 10 前台和后台访问
Android 10 仅限前台访问
Android 10 (系统忽略) 无访问权限
Android 9 或更低版本 设备升级时系统自动添加 前台和后台访问
Android 9 或更低版本 (系统忽略) 无访问权限

请注意,即使系统自动更新了您的应用对设备位置的访问权限,用户仍然可以更改此访问级别。例如,用户可能会将您的应用的访问权限限制为仅限前台,或完全撤销访问权限。在尝试访问设备位置(特别是在前台服务中)之前,您的应用应检查用户是否仍允许您的应用接收此位置信息。

在 Android 10 设备上更新目标 API 级别时撤销访问权限

考虑您的应用已安装在运行 Android 10 的设备上的情况。如果在此情况下将应用更新为面向 Android 10,则设备会撤销 ACCESS_BACKGROUND_LOCATION 权限。

有关如何在应用处于后台时检索设备位置的更多信息,请参阅有关接收周期性位置更新的指南。

后台启动 activity 的限制

从 Android 10 开始,系统对从后台启动 activity 施加了限制。此行为变更有助于最大限度地减少对用户的干扰,并让用户更好地控制屏幕上显示的内容。只要您的应用是用户直接交互的结果而启动 activity,您的应用很可能不会受到这些限制的影响。

要详细了解从后台启动 activity 的推荐替代方案,请参阅有关如何在应用中提醒用户时间敏感事件的指南。

标识符和数据

本部分列出了与处理设备标识符和数据相关的特定变更。

移除联系人亲和力

从 Android 10 开始,平台不再跟踪联系人亲和力信息。因此,如果您的应用对用户的联系人执行搜索,则结果不会按交互频率排序。

有关 ContactsProvider 的指南包含一份通知,其中描述了从 Android 10 开始在所有设备上已过时的特定字段和方法

MAC 地址随机化

在运行 Android 10 或更高版本的设备上,系统默认传输随机 MAC 地址。

如果您的应用处理企业用例,则平台会提供用于执行与 MAC 地址相关的多项操作的 API:

  • 获取随机 MAC 地址:设备所有者应用和资料所有者应用可以通过调用 getRandomizedMacAddress() 来检索分配给特定网络的随机 MAC 地址。
  • 获取实际出厂 MAC 地址:设备所有者应用可以通过调用 getWifiMacAddress() 来检索设备的实际硬件 MAC 地址。此方法对于跟踪设备群很有用。

访问 /proc/net 文件系统的限制

在运行 Android 10 或更高版本的设备上,应用无法访问 /proc/net(其中包含设备的网络状态信息)。需要访问此信息的应用(例如 VPN)应使用 NetworkStatsManagerConnectivityManager 类。

不可重置设备标识符的限制

从 Android 10 开始,应用必须拥有 READ_PRIVILEGED_PHONE_STATE 特权权限才能访问设备的不可重置标识符,其中包括 IMEI 和序列号。

受影响的方法包括以下内容:

如果您的应用没有该权限,而您仍然尝试请求有关不可重置标识符的信息,则平台的响应会因目标 SDK 版本而异:

  • 如果您的应用面向 Android 10 或更高版本,则会发生 SecurityException
  • 如果您的应用面向 Android 9(API 级别 28)或更低版本,则如果应用拥有 READ_PHONE_STATE 权限,则该方法会返回 null 或占位符数据。否则,会发生 SecurityException

许多用例不需要不可重置的设备标识符。例如,如果您的应用使用不可重置的设备标识符进行广告跟踪或用户分析,请改为针对这些特定用例使用 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 网络列表的手动配置仅限于系统应用和设备政策控制器 (DPC)。给定的 DPC 可以是设备所有者或资料所有者。

如果您的应用面向 Android 10 或更高版本,且不是系统应用或 DPC,则以下方法不会返回有用的数据:

如果您的应用需要连接到 Wi-Fi 网络,请使用以下替代方法:

某些电话、蓝牙、Wi-Fi API 需要精确位置权限

如果您的应用面向 Android 10 或更高版本,则必须拥有 ACCESS_FINE_LOCATION 权限才能使用 Wi-Fi、Wi-Fi Aware 或蓝牙 API 中的多个方法。以下部分列出了受影响的类和方法。

电话

Wi-Fi

蓝牙

权限

本部分介绍了 Android 权限模型的更新。

屏幕内容的受限访问

为了保护用户的屏幕内容,Android 10 通过更改 READ_FRAME_BUFFERCAPTURE_VIDEO_OUTPUTCAPTURE_SECURE_VIDEO_OUTPUT 权限的范围,防止静默访问设备的屏幕内容。从 Android 10 开始,这些权限仅支持签名访问

需要访问设备屏幕内容的应用应使用 MediaProjection API,该 API 会显示一个提示,要求用户提供同意。

面向用户的旧版应用权限检查

如果您的应用面向 Android 5.1(API 级别 22)或更低版本,则用户在首次在运行 Android 10 或更高版本的设备上使用您的应用时,会看到一个权限屏幕,如图 1 所示。此屏幕让用户有机会撤销系统以前在安装时授予您的应用的权限。

Screen capture of dialog
图 1. 允许用户查看旧版权限的对话框

身体活动识别

Android 10 引入了 android.permission.ACTIVITY_RECOGNITION 运行时权限,适用于需要检测用户步数或分类用户身体活动(例如步行、骑自行车或在车辆中移动)的应用。此设计旨在让用户在“设置”中了解设备传感器数据的使用方式。

Google Play 服务中的某些库,例如活动识别 APIGoogle 健身 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 中查找权限如何分组