Изменения в настройках конфиденциальности в Android 10

В Android 10 (уровень API 29) появилось несколько функций и изменений, которые помогают лучше защищать конфиденциальность пользователей. Эти изменения расширяют возможности пользователей по управлению своими данными и разрешениями, которые они предоставляют приложениям. Из-за этого некоторые функции или данные, от которых зависит ваше приложение, могут работать не так, как в более ранних версиях платформы. Если вы уже следуете рекомендациям по обработке пользовательских данных, то изменения практически не повлияют на ваше приложение.

На этой странице приводится сводка по каждому изменению.

Основные изменения

В этом разделе описаны основные изменения в Android 10, связанные с конфиденциальностью.

Доступ к внешнему хранилищу ограничен файлами и медиаконтентом приложения

По умолчанию приложениям, предназначенным для Android 10 и более поздних версий, предоставляется ограниченный доступ к внешнему хранилищу, или области хранения данных. Такие приложения могут просматривать следующие типы файлов на внешнем накопителе без запроса разрешений пользователя:

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

Для доступа к данным о местоположении устройства в фоновом режиме требуется разрешение

Чтобы пользователи могли лучше контролировать доступ приложения к данным о местоположении, в Android 10 появилось разрешение ACCESS_BACKGROUND_LOCATION.

В отличие от разрешений ACCESS_FINE_LOCATION и ACCESS_COARSE_LOCATION, разрешение ACCESS_BACKGROUND_LOCATION влияет только на доступ приложения к данным о местоположении, когда оно работает в фоновом режиме. Приложение считается получающим доступ к данным о местоположении в фоновом режиме, если не выполняется ни одно из следующих условий:

  • Пользователь видит действие, относящееся к приложению.
  • Приложение запускает активную службу, для которой объявлен тип location.

    Чтобы объявить тип активной службы в приложении, задайте для targetSdkVersion или compileSdkVersion значение 29 или выше. Подробнее о том, как активные службы могут продолжать действия, инициированные пользователем и требующие доступа к местоположению…

Если ваше приложение создает геозоны и отслеживает их и предназначено для Android 10 (уровень API 29) или более поздней версии, вы должны объявить разрешение ACCESS_BACKGROUND_LOCATION.

Доступ предоставляется автоматически, если целевой является ОС Android 9 или более ранней версии.

Если приложение работает на устройстве с Android 10 или более поздней версии, но предназначено для Android 9 (уровень API 28) или более ранней версии, то:

  • Если в приложении объявлен элемент <uses-permission> для ACCESS_FINE_LOCATION или ACCESS_COARSE_LOCATION, то во время установки система автоматически добавит элемент <uses-permission> для ACCESS_BACKGROUND_LOCATION.
  • Если приложение запрашивает разрешение ACCESS_FINE_LOCATION или ACCESS_COARSE_LOCATION, система автоматически добавляет в запрос разрешение ACCESS_BACKGROUND_LOCATION.

Доступно после обновления устройства до Android 10

Если пользователь предоставил приложению доступ к данным о местоположении устройства (ACCESS_COARSE_LOCATION или ACCESS_FINE_LOCATION), а затем обновил ОС Android с версии 9 до версии 10, система автоматически обновит набор разрешений на доступ к данным о местоположении, предоставленных приложению. Набор разрешений, которые приложение получит после обновления, зависит от целевой версии SDK и определенных разрешений, как показано в таблице ниже.

Таблица 1. Изменения в статусе разрешения на доступ к данным о местоположении после обновления устройства до Android 10

Целевая версия платформы Предоставлено разрешение на доступ к данным о приблизительном или точном местоположении?
Разрешение на работу в фоновом режиме
определено в манифесте?
Обновлен статус разрешения по умолчанию
Android 10 Да Да Доступ в активном и фоновом режимах
Android 10 Да Нет Доступ только в активном режиме
Android 10 Нет (игнорируется системой) Нет доступа
Android 9 или более ранней версии Да Добавляется системой автоматически при обновлении устройства. Доступ в активном и фоновом режимах
Android 9 или более ранней версии Нет (игнорируется системой) Нет доступа

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

Доступ отзывается при обновлении целевого уровня API на устройствах с Android 10

Предположим, что ваше приложение уже установлено на устройстве с Android 10. Если вы обновите приложение для Android 10, разрешение ACCESS_BACKGROUND_LOCATION будет отозвано.

Дополнительную информацию о том, как получить данные о местоположении устройства, когда приложение работает в фоновом режиме, можно найти в руководстве по периодическому получению данных о местоположении.

Ограничения на запуск процессов из фонового режима

Начиная с Android 10, система ограничивает запуск процессов из фонового режима. Это изменение помогает свести к минимуму прерывания для пользователя и позволяет ему лучше контролировать то, что показывается на экране. Если действия в вашем приложении запускаются в результате взаимодействия с пользователем, то, скорее всего, эти ограничения не затронут его.

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

Идентификаторы и данные

В этом разделе перечислены изменения, связанные с работой с идентификаторами и данными устройств.

Удаление связей между контактами

Начиная с Android 10 платформа не отслеживает информацию о частоте взаимодействия с контактами. В результате, если ваше приложение выполняет поиск по контактам пользователя, результаты не упорядочиваются по частоте взаимодействия.

В руководстве по ContactsProvider есть примечание с описанием полей и методов, которые устарели на всех устройствах, начиная с Android 10.

Случайное назначение MAC-адреса

На устройствах с Android 10 или более поздней версией ОС система по умолчанию передает случайные MAC-адреса.

Если ваше приложение предназначено для корпоративного использования, платформа предоставляет API для нескольких операций, связанных с MAC-адресами:

  • Получение случайного MAC-адреса. Приложения владельца устройства и профиля могут получать случайный MAC-адрес, назначенный определенной сети, с помощью вызова getRandomizedMacAddress().
  • Получение фактического заводского MAC-адреса. Приложения владельца устройства могут получить фактический аппаратный MAC-адрес устройства, вызвав метод getWifiMacAddress(). Этот способ подходит для отслеживания парка устройств.

Ограничение доступа к файловой системе /proc/net

На устройствах с Android 10 и более поздними версиями приложения не могут получить доступ к /proc/net, где содержится информация о состоянии сети устройства. Приложения, которым нужен доступ к этой информации, например VPN, должны использовать класс NetworkStatsManager или ConnectivityManager.

Ограничение на использование несбрасываемых идентификаторов устройств

Начиная с Android 10, приложениям требуется разрешение READ_PRIVILEGED_PHONE_STATE, чтобы получать доступ к несбрасываемым идентификаторам устройства, в том числе IMEI и серийному номеру.

Изменения затронут следующие методы:

Если у приложения нет разрешения и вы пытаетесь запросить информацию о несбрасываемых идентификаторах, ответ платформы зависит от целевой версии SDK:

  • Если приложение предназначено для Android 10 или более поздней версии, возникает ошибка SecurityException.
  • Если приложение предназначено для Android 9 (уровень API 28) или более ранней версии, метод возвращает null или плейсхолдер, если у приложения есть разрешение READ_PHONE_STATE. В противном случае произойдет SecurityException.

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

Ограниченный доступ к данным буфера обмена

Если ваше приложение не является редактором метода ввода (IME) по умолчанию или не находится в фокусе, оно не может получить доступ к данным буфера обмена на устройствах с Android 10 или более поздней версии.

Защита серийного номера USB-устройства

Если ваше приложение предназначено для Android 10 или более поздней версии, оно не сможет считать серийный номер, пока пользователь не предоставит ему разрешения для приложения на доступ к USB-устройству или аксессуару.

Подробнее о том, как работать с USB-устройствами, см. руководство по настройке USB-хостов.

Камера и подключение

В этом разделе перечислены изменения, относящиеся к метаданным камеры и API подключения.

Ограничение доступа к сведениям о камере и метаданным

В Android 10 изменен объем информации, которую метод getCameraCharacteristics() возвращает по умолчанию. В частности, у приложения должно быть разрешение CAMERA, чтобы получать доступ к метаданным, которые могут быть связаны с устройством и включены в возвращаемое значение этого метода.

Подробнее об этих изменениях читайте в разделе Поля камеры, для которых требуется разрешение.

Ограничение на включение и отключение Wi-Fi

Приложения, предназначенные для Android 10 или более поздней версии, не могут включать или отключать Wi-Fi. Метод WifiManager.setWifiEnabled() всегда возвращает false.

Если вам нужно предложить пользователям включить или отключить Wi-Fi, используйте панель настроек.

Ограничения на прямой доступ к настроенным сетям Wi-Fi

Чтобы защитить конфиденциальность пользователей, настраивать список сетей Wi-Fi вручную могут только системные приложения и контроллеры политик устройств. Контроллер политики может быть владельцем устройства или профиля.

Если ваше приложение предназначено для Android 10 или более поздней версии и не является системным приложением или контроллером политики устройств, то следующие методы не возвращают полезные данные:

  • Метод getConfiguredNetworks() всегда возвращает пустой список.

  • Каждый метод сетевой операции, возвращающий целочисленное значение (addNetwork() и updateNetwork()), всегда возвращает -1.

  • Каждая сетевая операция, которая возвращает логическое значение (removeNetwork(), reassociate(), enableNetwork(), disableNetwork(), reconnect() и disconnect()), всегда возвращает false.

Если вашему приложению нужно подключаться к сетям Wi-Fi, используйте следующие альтернативные методы:

  • Чтобы инициировать мгновенное локальное подключение к сети Wi-Fi, используйте WifiNetworkSpecifier в стандартном объекте NetworkRequest.
  • Чтобы добавить сети Wi-Fi, которые будут использоваться для предоставления пользователю доступа к интернету, используйте объекты WifiNetworkSuggestion. Вы можете добавлять и удалять сети, которые появляются в диалоговом окне выбора сети для автоматического подключения, вызывая методы addNetworkSuggestions() и removeNetworkSuggestions() соответственно. Для этих способов не требуется доступ к данным о местоположении.

Для некоторых API телефонии, Bluetooth и Wi-Fi требуется разрешение на доступ к точному местоположению.

Если ваше приложение предназначено для Android 10 или более поздней версии, у него должно быть разрешение ACCESS_FINE_LOCATION, чтобы использовать несколько методов в API Wi-Fi, Wi-Fi Aware или Bluetooth. В разделах ниже перечислены затронутые классы и методы.

Телефонная связь

Wi-Fi

Bluetooth

Разрешения

В этом разделе описаны изменения в модели разрешений Android.

Ограниченный доступ к содержимому экрана

Чтобы защитить содержимое экрана, в Android 10 запрещен скрытый доступ к нему. Для этого была изменена область действия разрешений READ_FRAME_BUFFER, CAPTURE_VIDEO_OUTPUT и CAPTURE_SECURE_VIDEO_OUTPUT. Начиная с Android 10, эти разрешения доступны только для signature-access.

Приложения, которым требуется доступ к содержимому экрана устройства, должны использовать API MediaProjection, который показывает запрос на согласие пользователя.

Проверка пользовательских разрешений для устаревших приложений

Если ваше приложение предназначено для Android 5.1 (уровень API 22) или более ранней версии, пользователи увидят экран разрешений, когда впервые запустят приложение на устройстве с Android 10 или более поздней версией (см. рисунок 1). На этом экране пользователи могут отозвать разрешения, которые система ранее предоставила вашему приложению во время установки.

Скриншот диалогового окна
Рисунок 1. Пользовательское диалоговое окно, позволяющее просматривать устаревшие разрешения

Распознавание физической активности

В Android 10 появилось динамическое разрешение android.permission.ACTIVITY_RECOGNITION для приложений, которым нужно подсчитывать количество шагов пользователя или классифицировать его физическую активность, например ходьбу, езду на велосипеде или передвижение на автомобиле. Это позволяет пользователям видеть, как данные датчиков устройства используются в настройках.

Некоторые библиотеки в сервисах Google Play, например Activity Recognition API и Google Fit API, не предоставляют результаты, если пользователь не предоставил приложению это разрешение.

Единственные встроенные датчики на устройстве, для которых требуется объявить это разрешение, – это счетчик шагов и детектор шагов.

Если ваше приложение предназначено для Android 9 (уровень API 28) или более ранней версии, система автоматически предоставляет ему разрешение android.permission.ACTIVITY_RECOGNITION, когда это необходимо, при условии, что выполняются следующие условия:

  • В файле манифеста указано разрешение com.google.android.gms.permission.ACTIVITY_RECOGNITION.
  • В файле манифеста не указано разрешение android.permission.ACTIVITY_RECOGNITION.

Если система автоматически предоставит разрешение android.permission.ACTIVITY_RECOGNITION, оно сохранится и после того, как вы обновите приложение для Android 10. Однако пользователь может в любой момент отозвать это разрешение в настройках системы.

Группы разрешений удалены из интерфейса

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