Поставщик контактов и информация о предпочтениях

В 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 изменились следующие поля:

Затронутые поля в 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

update
delete

Операция не выполнена.
ContactsContract.Contacts Strequent (с пометкой + часто используемые)
CONTENT_STREQUENT_FILTER_URI
CONTENT_STREQUENT_URI
CONTENT_FREQUENT_URI
Возвращает только помеченные контакты. Нет контактов, с которыми вы часто общаетесь.
ContactsContract.CommonDataKinds.Email
ContactsContract.CommonDataKinds.Phone
ContactsContract.CommonDataKinds.Callable
API фильтрации (автозаполнения)

CONTENT_FILTER_URI
ENTERPRISE_CONTENT_FILTER_URI

Результаты не сортируются по близости. Они отсортированы по отметке и названию.

Альтернативы

Альтернативных вариантов для устаревших полей API нет. Не допускаются обходные пути, предназначенные для обхода этих ограничений, независимо от того, представлены ли они в виде новых API или новых полей.

Реализация

Вам не нужно ничего делать, чтобы эти изменения вступили в силу. Они являются частью инициативы по повышению конфиденциальности пользователей на платформе ОС Android. Однако если ваши приложения используют устаревшие функции, вам может потребоваться обновить их, чтобы компенсировать изменения. Если вы используете форк поставщика контактов, его также необходимо обновить.

Без настроек

Не настраивайте и не обходите изменения в информации о степени близости контактов. Они встроены в структуру, и любые изменения приведут к нарушению соответствия. Не изменяйте настройки по умолчанию и не предлагайте альтернативные способы.