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) . Конкретный 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 приложения не могут просматривать, как сгруппированы разрешения в пользовательском интерфейсе.