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

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

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

Освобождение от ограничений на фоновое начало

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

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

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

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

Для разрешений while-in-use это может привести к потенциальной проблеме. Если у вашего приложения есть разрешение while-in-use, оно будет иметь его только пока оно находится в режиме foreground . Это означает, что если ваше приложение находится в фоновом режиме и пытается создать службу переднего плана типа камеры, местоположения или микрофона, система видит, что у вашего приложения в данный момент нет требуемых разрешений, и выдает SecurityException .

Аналогично, если ваше приложение работает в фоновом режиме и создает службу здравоохранения, которой требуется разрешение BODY_SENSORS , у приложения в данный момент нет этого разрешения, и система выдает исключение. (Это не применяется, если это служба здравоохранения, которой требуются другие разрешения, например ACTIVITY_RECOGNITION .) Вызов PermissionChecker.checkSelfPermission() не предотвращает эту проблему. Если у вашего приложения есть разрешение while-in-use, и оно вызывает 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
,

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

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

Освобождение от ограничений на фоновое начало

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

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

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

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

Для разрешений while-in-use это может привести к потенциальной проблеме. Если у вашего приложения есть разрешение while-in-use, оно будет иметь его только пока оно находится в режиме foreground . Это означает, что если ваше приложение находится в фоновом режиме и пытается создать службу переднего плана типа камеры, местоположения или микрофона, система видит, что у вашего приложения в данный момент нет требуемых разрешений, и выдает SecurityException .

Аналогично, если ваше приложение работает в фоновом режиме и создает службу здравоохранения, которой требуется разрешение BODY_SENSORS , у приложения в данный момент нет этого разрешения, и система выдает исключение. (Это не применяется, если это служба здравоохранения, которой требуются другие разрешения, например ACTIVITY_RECOGNITION .) Вызов PermissionChecker.checkSelfPermission() не предотвращает эту проблему. Если у вашего приложения есть разрешение while-in-use, и оно вызывает 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