В 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, так и серийный номер.
К затронутым методам относятся следующие:
-
Build
-
TelephonyManager
Если у вашего приложения нет разрешения и вы все равно пытаетесь запросить информацию о несбрасываемых идентификаторах, ответ платформы зависит от целевой версии 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 или выше и не является системным приложением или DPC, то следующие методы не возвращают полезные данные:
Метод
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. В следующих разделах перечислены затрагиваемые классы и методы.
Телефония
-
TelephonyManager
-
getCellLocation()
-
getAllCellInfo()
-
requestNetworkScan()
-
requestCellInfoUpdate()
-
getAvailableNetworks()
-
getServiceState()
-
-
TelephonyScanManager
-
requestNetworkScan()
-
-
TelephonyScanManager.NetworkScanCallback
-
onResults()
-
-
PhoneStateListener
-
onCellLocationChanged()
-
onCellInfoChanged()
-
onServiceStateChanged()
-
Wi-Fi
-
WifiManager
-
startScan()
-
getScanResults()
-
getConnectionInfo()
-
getConfiguredNetworks()
-
-
WifiAwareManager
-
WifiP2pManager
-
WifiRttManager
Bluetooth
-
BluetoothAdapter
-
startDiscovery()
-
startLeScan()
-
-
BluetoothAdapter.LeScanCallback
-
BluetoothLeScanner
-
startScan()
-
Разрешения
В этом разделе описываются обновления модели разрешений 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. Этот экран дает пользователям возможность отозвать доступ к разрешениям, которые система ранее предоставила вашему приложению во время установки.
Распознавание физической активности
В 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 приложения не могут просматривать, как сгруппированы разрешения в пользовательском интерфейсе.