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

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

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

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

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

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

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

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

Для разрешений «во время использования» это может привести к потенциальной проблеме. Если у вашего приложения есть разрешение «во время использования», оно действует только пока приложение находится в фоновом режиме . Это означает, что если ваше приложение работает в фоновом режиме и пытается создать службу переднего плана типа «камера», «локация» или «микрофон», система обнаруживает, что у вашего приложения в данный момент нет необходимых разрешений, и выдаёт исключение 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