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

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

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

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

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

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

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

  • Файлы в каталоге приложения, доступ к которым осуществляется с помощью getExternalFilesDir() .
  • Фотографии, видео и аудиоклипы, созданные приложением из медиа-магазина .

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

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

Чтобы обеспечить дополнительный контроль, который пользователи имеют над доступом приложения к информации о местоположении, в 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 до Android 10, система автоматически обновляет набор разрешений на основе местоположения, предоставленных вашему приложению. Набор разрешений, которые ваше приложение получает после обновления, зависит от целевой версии SDK и определенных разрешений, как показано в следующей таблице:

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

Целевая версия платформы Грубо или мелко
разрешение получено?
Фоновое разрешение
определено в манифесте?
Обновлено состояние разрешений по умолчанию.
Андроид 10 Да Да Доступ к переднему и фоновому режиму
Андроид 10 Да Нет Доступ только на переднем плане
Андроид 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 ограничена системными приложениями и контроллерами политики устройств (DPC) . Данный ЦОД может быть либо владельцем устройства, либо владельцем профиля.

Если ваше приложение предназначено для 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 требуется разрешение FINE для определения местоположения.

Если ваше приложение предназначено для 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, эти разрешения доступны только по подписи .

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

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

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

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

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

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

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

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

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

  • Файл манифеста включает разрешение com.google.android.gms.permission.ACTIVITY_RECOGNITION .
  • Файл манифеста не содержит разрешения android.permission.ACTIVITY_RECOGNITION .

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

Группы разрешений удалены из пользовательского интерфейса.

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