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.
| Версия целевой платформы | Крупный или мелкий Разрешение получено? | Фоновое разрешение определено в манифесте? | Обновлено состояние разрешений по умолчанию |
|---|---|---|---|
| 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 и серийный номер.
К числу затронутых методов относятся следующие:
-
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.
Если система автоматически предоставляет разрешение android.permission.ACTIVITY_RECOGNITION , ваше приложение сохранит это разрешение после обновления до Android 10. Однако пользователь может отозвать это разрешение в любое время в системных настройках.
Группы разрешений удалены из пользовательского интерфейса.
Начиная с Android 10, приложения не могут узнать, как сгруппированы разрешения в пользовательском интерфейсе.