从 Android 10 开始,将采用与 Android 9 及更低版本中不同的方式访问由联系人提供程序组件(设备的“通讯录”应用中所显示数据的来源)管理的联系人亲密程度相关数据。
在 Android 10 之前,应用使用联系人提供程序访问数据并在设备和在线服务之间传输数据。Android 10 中引入了有关数据可访问性的变更,以确保在使用联系人提供程序的所有 Android 10 设备中增强用户隐私保护。例如,底层数据库中不包含联系人亲密程度数据。因此,应用无法将此类数据写入该数据库,也无法从中读取此类数据。变更包括:
- 联系人提供程序不记录联系人亲密程度相关数据,例如某个用户被联系的次数、上次联系时间、使用的应用、联系的人或任何相关历史数据。
- 联系人提供程序自动补全 API 中的
MultiAutoCompleteTextView
类不会按互动计数器对查询结果进行排序。 - Android 框架不提供隐式联系人排名(不过,仍然提供由用户控制的显式联系人排名,如已加星标的联系人)。
要实施这些变更,请执行以下操作之一:
- 使用最新的联系人提供程序。
- 更新您的版本(如果您使用的是分支版本)。
此外,请更新任何依赖于已废弃的联系人提供程序功能的应用。不允许使用旨在针对已废弃的功能给出权宜解决方法的 API 版本。
在 Android 9 及更低版本中,联系人提供程序中的联系人互动数据尚未移除,而在 Android 10 中,系统会定期清除联系人互动数据(大约每天一次),以模拟同等效果。联系人提供程序会存储此类信息,但只是暂时存储。
API 变更
预计这些变更会对 API 产生很大影响。例如,自动补全排名也将无法执行。对 API 行为的潜在影响包括:
- 联系人提供程序不会在
ContactsContract.Contacts
表格列中存储用户对联系人的偏好或与联系人的互动信息。 - 自动补全 API 不会按互动计数器对结果进行排序。
TIMES_CONTACTED
/TIMES_USED
和LAST_TIME_CONTACTED
/LAST_TIME_USED
列不会更新。- 升级到 Android 10 后,这些要么清空为
null
,要么设为 0,具体取决于受影响的列。 - 自动补全查询 API 中的排名将返回按字母顺序(从不按亲密程度信息)排序的结果。
- 对常用联系人的 API 调用(例如,使用过滤器字符串
CONTENT_FREQUENT_URI
)不会返回任何结果。
通常,如果任何已废弃的联系人提供程序 API 元素使用计数器,这些计数器(在 Android 10 中使用时)就包含 0,且会在查询时返回 0。系统会忽略来自受影响 API 的更新请求。例如,ContactsContract.DataUsageFeedback
类已被废弃,因此系统会忽略对此类的更新和删除调用。
影响 API 的字段
在 Android 10 中,以下字段已发生更改:
ContactsContract.ContactOptionsColumns#TIMES_CONTACTED
ContactsContract.ContractOptionsColumns.LAST_TIME_CONTACTED
ContactsContract.DataUsageStatColumns#TIMES_USED
ContactsContract.DataUsageStatColumns#LAST_TIME_USED
ContactsContract#CONTENT_STREQUENT_FILTER_URI
ContactsContract.Contacts#CONTENT_STREQUENT_URI
ContactsContract.Contacts#CONTENT_FREQUENT_URI
ContactsContract.Contacts#ENTERPRISE_CONTENT_FILTER_URI
ContactsContract.Contacts#CONTENT_FILTER_URI
Android 10 中受影响的字段可能存在于不同的 API 中,如下表所示。已废弃的 API 字段会返回所列的行为。由于这些已废弃字段中的某一个可能会在您的多个 API 中使用,因此请验证您的用例。
类 | API 字段 | 10 返回 |
---|---|---|
ContactsContract.Contacts ContactsContract.RawContacts ContactsContract.Data ContactsContract.Entity
|
ContactOptionsColumns TIMES_CONTACTED LAST_TIME_CONTACTED
|
无论这些列的使用方式如何,它们始终包含 0。对它们做出的修改尝试将被忽略。 |
Contacts
|
markAsContacted() |
无操作。 |
ContactsContract.DataUsageFeedback
|
|
无操作。 |
ContactsContract.Contacts
|
Strequent(已加星标 + 常用)CONTENT_STREQUENT_FILTER_URI CONTENT_STREQUENT_URI CONTENT_FREQUENT_URI
|
仅返回已加星标的联系人。不会返回常用联系人。 |
ContactsContract.CommonDataKinds.Email ContactsContract.CommonDataKinds.Phone ContactsContract.CommonDataKinds.Callable
|
Filter API(也称为 Autocomplete API)
|
结果并不按亲密程度排序,而是按已加星标和名称排序。 |
替代方案
已废弃的 API 字段没有替代选项。不允许使用旨在规避这些限制的权宜解决方法(无论是以新 API 还是新字段的形式)。
实现
您无需执行任何操作即可实现这些变更。这些变更是一项倡议的一部分,旨在增强 Android OS 平台上的用户隐私保护。但是,如果您的应用依赖于已废弃的功能,则您可能需要更新应用以抵补任何变更带来的差异。此外,如果您使用联系人提供程序的派生版本,则必须更新联系人提供程序。
禁止自定义
请勿自定义联系人亲密程度信息变更,也不要利用权宜解决方法绕过这些变更。这些变更内置在框架中,如果您对其做出任何更改,将违反相关规定。切勿改动默认设置或提供后门替代选项。