Starting in Android 10, contacts-affinity-related data, managed by the Contacts Provider component (the source of data seen in a device's contacts app), is accessed differently than in Android 9 and lower.
Prior to Android 10, apps used the Contacts Provider to access data and transfer it between a device and online services. Android 10 features changes regarding data accessibility to ensure increased user privacy in all Android 10 devices that use the Contacts Provider. For one, the underlying database doesn't contain contact affinities data. Therefore apps can't write to or read from it. Changes include the following:
- The Contacts Provider doesn't record contacts-affinity-related data, such as the number of times a user was contacted, the last time of contact, the app used, the person contacted, or any related historical data.
- The
MultiAutoCompleteTextView
class in the Contacts Provider autocomplete API doesn't sort query results by interaction counter. - The Android framework doesn't provide implicit contacts ranking. (However, user-controlled, explicit contacts ranking (such as starred contacts) remains).
To implement these changes, do one of the following:
- Use the latest Contacts Provider.
- Update your version (if you're using a forked version).
In addition, update any apps that rely on the deprecated Contacts Provider features. API versions designed to be workarounds to the deprecated functions aren't allowed.
For Android 9 and lower, contact-interaction data from the Contacts Provider hasn't been removed. Instead, contact-interaction data is cleared periodically (approximately once per day) to simulate the equivalent in Android 10. The Contacts Provider stores this information, but only temporarily.
API changes
These changes are expected to have a large impact on APIs. For example, autocomplete ranking won't perform as well. Potential impacts on API behavior include the following:
- The Contacts Provider won't store a user's preferences for, or interactions
with, the contact in the
ContactsContract.Contacts
table columns. - The autocomplete API won't sort results by interaction counter.
- The
TIMES_CONTACTED
/TIMES_USED
andLAST_TIME_CONTACTED
/LAST_TIME_USED
columns won't be updated. - These clear (to either
null
or set to 0, depending on the affected columns) upon upgrade to Android 10. - Ranking in the autocomplete query APIs returns results sorted alphabetically, never by affinity information.
- API calls for frequent contacts (for example, using the filter string
CONTENT_FREQUENT_URI
) return no results.
Generally, if any of the deprecated Contacts Provider API elements use counters,
those counters (when used in Android 10) contain 0, and
return 0 when queried. Update requests from affected APIs are ignored. For
example, the ContactsContract.DataUsageFeedback
class was
deprecated, so update and delete calls to this class are ignored.
Fields that impact APIs
These fields have changed in 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
The affected fields in Android 10 may be present in different APIs, as indicated in the table below. Deprecated API fields return behaviors as listed. Because one of these deprecated fields may be used in several of your APIs, verify your use cases.
Class | API fields | 10 returns |
---|---|---|
ContactsContract.Contacts ContactsContract.RawContacts ContactsContract.Data ContactsContract.Entity
|
ContactOptionsColumns TIMES_CONTACTED LAST_TIME_CONTACTED
|
These columns always contain 0, regardless of how they're used. Attempts to modify them are ignored. |
Contacts
|
markAsContacted() |
No operation. |
ContactsContract.DataUsageFeedback
|
|
No operation. |
ContactsContract.Contacts
|
Strequent (starred + frequent)CONTENT_STREQUENT_FILTER_URI CONTENT_STREQUENT_URI CONTENT_FREQUENT_URI
|
Returns starred contacts only. No frequent contacts returned. |
ContactsContract.CommonDataKinds.Email ContactsContract.CommonDataKinds.Phone ContactsContract.CommonDataKinds.Callable
|
Filter (also called autocomplete) APIs
|
Results not sorted by affinity. These are sorted by starred and name. |
Alternatives
There are no alternatives to the deprecated API fields. Workarounds designed to circumvent these restrictions, whether in the form of new APIs or new fields, aren't allowed.
Implementation
You don't need to do anything to implement these changes. They're part of the initiative to increase user privacy on the Android OS platform. However, if your apps rely on deprecated features, you may want to update your apps to compensate for any changes. Additionally, if you use a forked version of the Contacts Provider, you must update your Contacts Provider.
No customization
Don't customize or work around the contacts affinity information changes. They're built into the framework, and making any changes takes you out of compliance. Never alter the default settings or provide backdoor alternatives.