В Android 10 и более поздних версиях доступ к данным, связанным с предпочтениями контактов, которыми управляет компонент Поставщик контактов (источник данных, которые показываются в приложении "Контакты" на устройстве), осуществляется иначе, чем в Android 9 и более ранних версиях.
До Android 10 приложения использовали поставщика контактов для доступа к данным и их передачи между устройством и онлайн-сервисами. В Android 10 изменены правила доступа к данным, чтобы повысить конфиденциальность пользователей всех устройств Android 10, в которых используется поставщик контактов. Во-первых, базовая база данных не содержит данных о сходстве контактов. Поэтому приложения не могут записывать в него данные или считывать их. Изменения включают следующее:
- Поставщик контактов не записывает данные, связанные с частотой взаимодействия с контактами, например количество обращений к контакту, время последнего обращения, использованное приложение, контактное лицо или любые связанные с этим статистические данные.
- Класс
MultiAutoCompleteTextViewв API автозаполнения поставщика контактов не сортирует результаты запроса по счетчику взаимодействий. - В фреймворке 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_CONTACTEDContactsContract.ContractOptionsColumns.LAST_TIME_CONTACTEDContactsContract.DataUsageStatColumns#TIMES_USEDContactsContract.DataUsageStatColumns#LAST_TIME_USEDContactsContract#CONTENT_STREQUENT_FILTER_URIContactsContract.Contacts#CONTENT_STREQUENT_URIContactsContract.Contacts#CONTENT_FREQUENT_URIContactsContract.Contacts#ENTERPRISE_CONTENT_FILTER_URIContactsContract.Contacts#CONTENT_FILTER_URI
Затронутые поля в Android 10 могут присутствовать в разных API, как показано в таблице ниже. Поля API, поддержка которых прекращена, возвращают данные в соответствии с указанным поведением. Поскольку одно из этих устаревших полей может использоваться в нескольких ваших API, проверьте свои варианты использования.
| Класс | Поля API | 10 возвратов |
|---|---|---|
ContactsContract.ContactsContactsContract.RawContactsContactsContract.DataContactsContract.Entity
|
ContactOptionsColumnsTIMES_CONTACTEDLAST_TIME_CONTACTED
|
В этих столбцах всегда будет значение 0, независимо от того, как они используются. Попытки изменить их игнорируются. |
Contacts
|
markAsContacted() |
Операция не выполнена. |
ContactsContract.DataUsageFeedback
|
|
Операция не выполнена. |
ContactsContract.Contacts
|
Strequent (с пометкой + часто используемые)CONTENT_STREQUENT_FILTER_URICONTENT_STREQUENT_URICONTENT_FREQUENT_URI
|
Возвращает только помеченные контакты. Нет контактов, с которыми вы часто общаетесь. |
ContactsContract.CommonDataKinds.EmailContactsContract.CommonDataKinds.PhoneContactsContract.CommonDataKinds.Callable
|
API фильтрации (автозаполнения)
|
Результаты не сортируются по близости. Они отсортированы по отметке и названию. |
Альтернативы
Альтернативных вариантов для устаревших полей API нет. Не допускаются обходные пути, предназначенные для обхода этих ограничений, независимо от того, представлены ли они в виде новых API или новых полей.
Реализация
Вам не нужно ничего делать, чтобы эти изменения вступили в силу. Они являются частью инициативы по повышению конфиденциальности пользователей на платформе ОС Android. Однако если ваши приложения используют устаревшие функции, вам может потребоваться обновить их, чтобы компенсировать изменения. Если вы используете форк поставщика контактов, его также необходимо обновить.
Без настроек
Не настраивайте и не обходите изменения в информации о степени близости контактов. Они встроены в структуру, и любые изменения приведут к нарушению соответствия. Не изменяйте настройки по умолчанию и не предлагайте альтернативные способы.