Restrições para iniciar um serviço em primeiro plano em segundo plano

Os apps destinados ao Android 12 (nível 31 da API) ou versões mais recentes não podem iniciar serviços em primeiro plano enquanto estão em segundo plano, exceto em alguns casos especiais. Se um app tentar iniciar um serviço em primeiro plano enquanto estiver em segundo plano, e o serviço em primeiro plano não atender a um dos casos excepcionais, o sistema vai gerar uma ForegroundServiceStartNotAllowedException.

Além disso, se um app quiser iniciar um serviço em primeiro plano que precise de permissões durante o uso (por exemplo, permissões de sensor corporal, câmera, microfone ou localização), ele não poderá criar o serviço enquanto estiver em segundo plano, mesmo que se enquadre em uma das isenções das restrições de início em segundo plano. O motivo disso é explicado na seção Restrições para iniciar serviços em primeiro plano que precisam de permissões durante o uso.

Isenções das restrições de inicialização em segundo plano

Nas situações abaixo, o app pode iniciar serviços em primeiro plano mesmo durante a execução em segundo plano:

Restrições para iniciar serviços em primeiro plano que precisam de permissões durante o uso

No Android 14 (nível 34 da API) ou versões mais recentes, há situações especiais que você precisa conhecer se estiver iniciando um serviço em primeiro plano que precisa de permissões durante o uso.

Se o app for destinado ao Android 14 ou versões mais recentes, o sistema operacional vai verificar se o app tem todas as permissões adequadas para o tipo de serviço em primeiro plano criado. Por exemplo, quando você cria um serviço em primeiro plano do tipo microphone, o sistema operacional verifica se o app tem a permissão RECORD_AUDIO. Se você não tiver essa permissão, o sistema vai gerar uma SecurityException.

Para permissões durante o uso, isso causa um possível problema. Se o app tiver uma permissão durante o uso, ela só será válida enquanto ele estiver em primeiro plano. Isso significa que, se o app estiver em segundo plano e tentar criar um serviço em primeiro plano do tipo câmera, localização ou microfone, o sistema vai identificar que o app não tem as permissões necessárias no momento e vai gerar uma SecurityException.

Da mesma forma, se o app estiver em segundo plano e criar um recurso de saúde que precise da permissão BODY_SENSORS, o app não terá essa permissão no momento, e o sistema vai gerar uma exceção. Isso não se aplica se for um serviço de saúde que precisa de permissões diferentes, como ACTIVITY_RECOGNITION. Chamar PermissionChecker.checkSelfPermission() não evita esse problema. Se o app tiver uma permissão durante o uso e chamar checkSelfPermission() para verificar se tem essa permissão, o método vai retornar PERMISSION_GRANTED mesmo que o app esteja em segundo plano. Quando o método retorna PERMISSION_GRANTED, ele está dizendo "seu app tem essa permissão enquanto está em uso".

Por esse motivo, se o serviço em primeiro plano precisar de uma permissão durante o uso, será necessário chamar Context.startForegroundService() ou Context.bindService() enquanto o app tiver uma atividade visível, a menos que o serviço se enquadre em uma das isenções definidas.

Isenções de restrições em permissões durante o uso

Em algumas situações, mesmo que um serviço em primeiro plano seja iniciado enquanto o app é executado em segundo plano, ele ainda pode acessar informações de localização, câmera e microfone enquanto o app é executado em primeiro plano ("durante o uso").

Nessas mesmas situações, se o serviço declarar um tipo de serviço em primeiro plano de location e for iniciado por um app que tenha a permissão ACCESS_BACKGROUND_LOCATION, ele poderá acessar as informações de localização o tempo todo, mesmo quando o app for executado em segundo plano.

A lista a seguir contém essas situações:

  • Um componente do sistema inicia o serviço.
  • O serviço começa interagindo com widgets de apps.
  • O serviço começa interagindo com uma notificação.
  • O serviço é iniciado como um PendingIntent enviado de um app diferente e visível.
  • O serviço é iniciado por um app que é um controlador de política do dispositivo que é executado no modo de proprietário do dispositivo.
  • O serviço é iniciado por um app que fornece o VoiceInteractionService.
  • O serviço é iniciado por um app que tem a permissão privilegiada START_ACTIVITIES_FROM_BACKGROUND.

Determinar quais serviços são afetados no seu app

Ao testar seu app, inicie os serviços em primeiro plano. Se um serviço iniciado tiver acesso restrito à localização, ao microfone e à câmera, a seguinte mensagem será exibida no Logcat:

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