Изменения в поведении: приложения для Android 13 и более поздних версий

Как и в предыдущих версиях, в Android 13 есть изменения, которые могут повлиять на работу вашего приложения. Они касаются только приложений, предназначенных для Android 13 или более поздней версии. Если ваше приложение предназначено для Android 13 или более поздней версии, вам следует изменить его, чтобы оно поддерживало эти функции, где это применимо.

Также ознакомьтесь со списком изменений в поведении, которые затрагивают все приложения, работающие на Android 13.

Конфиденциальность

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

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

Новое динамическое разрешение для устройств Wi-Fi поблизости

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

Поскольку пользователям сложно связать разрешения на доступ к данным о местоположении с функциями Wi-Fi, в Android 13 (уровень API 33) введено динамическое разрешение в группе разрешений NEARBY_DEVICES для приложений, которые управляют подключениями устройства к ближайшим точкам доступа по Wi-Fi. Разрешение NEARBY_WIFI_DEVICES позволяет выполнять следующие действия:

  • Находить устройства поблизости, например принтеры или устройства для трансляции медиаконтента, и подключаться к ним. Этот рабочий процесс позволяет приложению выполнять следующие задачи:
    • Получать информацию о точке доступа по внешнему каналу, например через BLE.
    • Обнаруживайте устройства и подключайтесь к ним через Wi-Fi Aware и локальную точку доступа.
    • Обнаруживать устройства и подключаться к ним через Wi-Fi Direct.
  • Подключаться к известным SSID, например к автомобилю или устройству умного дома.
  • Запустите локальную точку доступа.
  • Определять расстояние до устройств поблизости с поддержкой Wi-Fi Aware.

Если ваше приложение не получает данные о физическом местоположении от API Wi-Fi, запрашивайте NEARBY_WIFI_DEVICES вместо ACCESS_FINE_LOCATION, когда вы настраиваете таргетинг на Android 13 или более поздней версии и используете API Wi-Fi. При объявлении разрешения NEARBY_WIFI_DEVICES убедительно докажите, что ваше приложение никогда не получает геоданные от API Wi-Fi. Для этого задайте атрибуту android:usesPermissionFlags значение neverForLocation. Этот процесс похож на тот, который вы выполняете в Android 12 (уровень API 31) и более поздних версиях, когда утверждаете, что информация об устройстве Bluetooth никогда не используется для определения местоположения.

Подробнее о том, как запросить разрешение на доступ к устройствам Wi-Fi поблизости…

Детализированные разрешения для медиафайлов

В диалоговом окне есть две кнопки: "Разрешить" и "Запретить".
Рисунок 1. Диалоговое окно системных разрешений, которое видит пользователь, когда вы запрашиваете разрешение READ_MEDIA_AUDIO.

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

Тип медиаконтента Разрешение на запрос
Изображения и фотографии READ_MEDIA_IMAGES
Видео READ_MEDIA_VIDEO
Аудиофайлы READ_MEDIA_AUDIO

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

На рисунке 1 показано приложение, запрашивающее разрешение READ_MEDIA_AUDIO.

Если вы запрашиваете разрешения READ_MEDIA_IMAGES и READ_MEDIA_VIDEO одновременно, появляется только одно системное диалоговое окно.

Если вашему приложению ранее было предоставлено разрешение READ_EXTERNAL_STORAGE, то при обновлении все запрошенные разрешения READ_MEDIA_* будут предоставлены автоматически. Чтобы проверить обновленные разрешения, используйте следующую команду ADB:

adb shell cmd appops get --uid PACKAGE_NAME

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

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

Если ваше приложение предназначено для Android 13 и ему требуется доступ к данным нательных датчиков в фоновом режиме, вы должны объявить новое разрешение BODY_SENSORS_BACKGROUND в дополнение к существующему BODY_SENSORS.

Производительность и батарея

Использование ресурсов батареи

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

Удобство использования

Элементы управления мультимедиа из приложения "PlaybackState"

Для приложений, предназначенных для Android 13 (уровень API 33) и более поздних версий, система получает элементы управления мультимедиа из действий PlaybackState. Это позволяет системе показывать более широкий набор элементов управления, которые технически совместимы с телефонами и планшетами, а также соответствуют тому, как элементы управления мультимедиа отображаются на других платформах Android, таких как Android Auto и Android TV.

На рисунке 2 показано, как это выглядит на телефоне и планшете.

Элементы управления мультимедиа на телефонах и планшетах. На примере трека показано, как могут выглядеть кнопки.
Рисунок 2. Элементы управления мультимедиа на телефоне и планшете.

В версиях до Android 13 система показывала до пяти действий из уведомления MediaStyle в том порядке, в котором они были добавлены. В компактном режиме, например в свернутых быстрых настройках, показывалось до трех действий, заданных с помощью setShowActionsInCompactView().

Начиная с Android 13 система показывает до пяти командных кнопок на основе PlaybackState, как описано в таблице ниже. В компактном режиме будут показаны только первые три слота. Для приложений, которые не предназначены для Android 13 или не включают PlaybackState, система будет отображать элементы управления на основе списка Action, добавленного в уведомление MediaStyle, как описано в предыдущем абзаце.

Слот Действие Критерии
1 Воспроизвести Текущее состояние PlaybackState может быть одним из следующих:
  • STATE_NONE
  • STATE_STOPPED
  • STATE_PAUSED
  • STATE_ERROR
Индикатор выполнения Текущее состояние PlaybackState может быть одним из следующих:
  • STATE_CONNECTING
  • STATE_BUFFERING
Приостановить Текущее состояние PlaybackState не соответствует ни одному из перечисленных выше.
2 Назад PlaybackState действий, включая ACTION_SKIP_TO_PREVIOUS.
Свой вариант PlaybackState действий не включают ACTION_SKIP_TO_PREVIOUS, а PlaybackState настраиваемых действий включают настраиваемое действие, которое ещё не было размещено.
Пусто PlaybackState extras включает логическое значение true для ключа SESSION_EXTRAS_KEY_SLOT_RESERVATION_SKIP_TO_PREV.
3 Далее PlaybackState действий, в том числе ACTION_SKIP_TO_NEXT.
Свой вариант PlaybackState действий не включают ACTION_SKIP_TO_NEXT, а PlaybackState настраиваемых действий включают настраиваемое действие, которое ещё не было размещено.
Пусто PlaybackState extras включает логическое значение true для ключа SESSION_EXTRAS_KEY_SLOT_RESERVATION_SKIP_TO_NEXT.
4 Свой вариант PlaybackState настраиваемое действие включает настраиваемое действие, которое ещё не было размещено.
5 Свой вариант PlaybackState настраиваемое действие включает настраиваемое действие, которое ещё не было размещено.

Настраиваемые действия размещаются в том порядке, в котором они были добавлены в PlaybackState.

Цветовая тема приложения автоматически применяется к контенту WebView

Для приложений, предназначенных для Android 13 (уровень API 33) или более поздних версий, метод setForceDark() устарел и не работает при вызове.

Теперь WebView всегда задает запрос медиа prefers-color-scheme в соответствии с атрибутом темы приложения isLightTheme. Другими словами, если для isLightTheme задано значение true или не задано никакое, то для prefers-color-scheme задается значение light, а в противном случае – dark. Это означает, что светлый или темный стиль веб-контента применяется автоматически в соответствии с темой приложения, если контент его поддерживает.

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

Если вам все же нужно настроить поведение цветовой темы приложения, используйте метод setAlgorithmicDarkeningAllowed(). Для обратной совместимости с предыдущими версиями Android рекомендуем использовать эквивалентный метод setAlgorithmicDarkeningAllowed() в AndroidX.

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

Функции связи

Методы BluetoothAdapter#enable() и BluetoothAdapter#disable() объявлены устаревшими

Для приложений, предназначенных для Android 13 (уровень API 33) или более поздней версии, методы BluetoothAdapter#enable() и BluetoothAdapter#disable() устарели и всегда возвращают false.

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

  • Приложения для владельцев устройств
  • Приложения владельца профиля
  • Системные приложения

Сервисы Google Play

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

В приложениях, которые используют рекламный идентификатор сервисов Google Play и предназначены для Android 13 (уровень API 33) и более поздних версий, в файле манифеста должно быть указано обычное разрешение AD_ID.

<manifest ...>
    <!-- Required only if your app targets Android 13 or higher. -->
    <uses-permission android:name="com.google.android.gms.permission.AD_ID"/>

    <application ...>
        ...
    </application>
</manifest>

Если вы не объявите это разрешение в приложении, предназначенном для Android 13 или более поздней версии, рекламный идентификатор будет автоматически удален и заменен строкой, состоящей из нулей.

Если в вашем приложении есть SDK с разрешением AD_ID, указанным в манифесте библиотеки, то по умолчанию оно будет объединено с файлом манифеста вашего приложения. В этом случае вам не нужно объявлять разрешение в файле манифеста приложения.

Подробные сведения можно найти в статье Рекламный идентификатор в Справочном центре Play Console.

Обновленные ограничения, не связанные с SDK

В Android 13 обновлены списки ограниченных интерфейсов, не относящихся к SDK. Это сделано на основе сотрудничества с разработчиками Android и последних внутренних тестов. По возможности мы стараемся сделать так, чтобы перед ограничением интерфейсов, не входящих в SDK, были доступны общедоступные альтернативы.

Если ваше приложение не поддерживает Android 13, некоторые из этих изменений могут не затронуть вас сразу. Однако, хотя в настоящее время вы можете использовать некоторые интерфейсы, не относящиеся к SDK (в зависимости от целевого уровня API вашего приложения), использование любого метода или поля, не относящегося к SDK, всегда сопряжено с высоким риском нарушения работы вашего приложения.

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

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