Ограничения на запуск активной службы из фонового режима

Приложения, предназначенные для Android 12 (уровень API 31) или более поздних версий, не могут запускать активные службы, когда работают в фоновом режиме, за некоторыми исключениями. Если приложение пытается запустить активную службу, работая в фоновом режиме, и эта служба не соответствует ни одному из исключений, система выдает ошибку ForegroundServiceStartNotAllowedException.

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

Исключения из ограничений на запуск в фоновом режиме

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

Ограничения на запуск активных служб, которым требуются разрешения на доступ во время использования

Если вы запускаете активную службу, которой требуются разрешения на доступ во время использования, в Android 14 (уровень API 34) или более поздней версии, обратите внимание на следующее:

Если приложение предназначено для Android 14 или более поздней версии, при создании активной службы операционная система проверяет, есть ли у приложения все необходимые разрешения для этого типа службы. Например, когда вы создаете активную службу типа microphone, операционная система проверяет, есть ли у приложения разрешение RECORD_AUDIO. Если у вас нет такого разрешения, система выдаст ошибку SecurityException.

Это может вызвать проблемы с разрешениями на доступ во время использования. Если у приложения есть разрешение на доступ к данным во время использования, оно может получать их, только когда работает в активном режиме. Это означает, что если приложение работает в фоновом режиме и пытается создать активную службу с типом camera, location или microphone, система видит, что у приложения в данный момент нет необходимых разрешений, и выдает ошибку SecurityException.

Аналогично, если приложение работает в фоновом режиме и создает сервис наблюдения за здоровьем, которому требуется разрешение BODY_SENSORS, у приложения сейчас нет этого разрешения и система выдает исключение. Это не относится к сервисам наблюдения за здоровьем, которым нужны другие разрешения, например ACTIVITY_RECOGNITION. Вызов PermissionChecker.checkSelfPermission() не решает эту проблему. Если у приложения есть разрешение на доступ во время использования и оно вызывает метод checkSelfPermission(), чтобы проверить наличие этого разрешения, метод возвращает PERMISSION_GRANTED, даже если приложение работает в фоновом режиме. Если метод возвращает значение PERMISSION_GRANTED, это означает, что у приложения есть разрешение, пока оно используется.

Поэтому, если активной службе требуется разрешение на доступ во время использования, вы должны вызвать Context.startForegroundService() или Context.bindService(), пока в приложении есть видимое действие, за исключением случаев, когда служба подпадает под одно из определенных исключений.

Исключения из ограничений на разрешения, действующие во время использования

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

В тех же ситуациях, если служба объявляет тип активной службы location и запускается приложением с разрешением ACCESS_BACKGROUND_LOCATION, она может получать доступ к данным о местоположении постоянно, даже когда приложение работает в фоновом режиме.

Ниже перечислены такие ситуации.

  • Сервис запускается системным компонентом.
  • Сервис запускается при взаимодействии с виджетами приложений.
  • Сервис запускается при взаимодействии с уведомлением.
  • Служба запускается как PendingIntent, отправленный из другого видимого приложения.
  • Сервис запускается приложением, которое является контроллером правил для устройств и работает в режиме владельца устройства.
  • Сервис запускается приложением, которое предоставляет VoiceInteractionService.
  • Сервис запускается приложением, у которого есть разрешение START_ACTIVITIES_FROM_BACKGROUND.

Определите, какие сервисы затронуты в вашем приложении

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

Foreground service started from background can not have \
location/camera/microphone access: service SERVICE_NAME