从 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,无论它们如何使用。修改它们的尝试将被忽略。 |
联系人
|
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
|
过滤器(也称为自动填充)API
|
结果不按亲密度排序。这些结果按已加星标和姓名排序。 |
替代方案
已弃用的 API 字段没有替代方案。不允许使用旨在规避这些限制的变通方法,无论是新 API 还是新字段的形式。
实现
您无需执行任何操作即可实施这些更改。它们是旨在提高 Android 操作系统平台上的用户隐私的举措的一部分。但是,如果您的应用依赖于已弃用的功能,您可能需要更新您的应用以补偿任何更改。此外,如果您使用联系人提供程序的派生版本,则必须更新您的联系人提供程序。
无自定义
请勿自定义或绕过联系人亲密度信息更改。它们已内置到框架中,进行任何更改都会使您不合规。切勿更改默认设置或提供后门替代方案。