Restrictions concernant le démarrage d'un service de premier plan en arrière-plan

Les applications qui ciblent Android 12 (niveau d'API 31) ou une version ultérieure ne peuvent pas démarrer de services de premier plan lorsque l'application s'exécute en arrière-plan, sauf dans quelques cas particuliers. Si une application tente de démarrer un service de premier plan pendant l'exécution en arrière-plan et que le service de premier plan ne répond pas à l'un des cas exceptionnels, le système génère une ForegroundServiceStartNotAllowedException.

De plus, si une application souhaite lancer un service de premier plan qui nécessite des autorisations en cours d'utilisation (par exemple, des autorisations pour les capteurs corporels, l'appareil photo, le micro ou la position), elle ne peut pas créer le service lorsque l'application est en arrière-plan, même si elle fait partie des exceptions aux restrictions de démarrage en arrière-plan. La raison en est expliquée dans la section Restrictions sur le démarrage de services de premier plan nécessitant des autorisations en cours d'utilisation.

Exceptions aux restrictions de démarrage en arrière-plan

Dans les situations suivantes, votre application peut démarrer des services de premier plan même lorsqu'elle s'exécute en arrière-plan:

Restrictions concernant le démarrage de services de premier plan nécessitant des autorisations en cours d'utilisation

Sur Android 14 (niveau d'API 34) ou version ultérieure, vous devez tenir compte de situations spéciales si vous démarrez un service de premier plan qui nécessite des autorisations en cours d'utilisation.

Si votre application cible Android 14 ou une version ultérieure, le système d'exploitation vérifie lorsque vous créez un service de premier plan que votre application dispose de toutes les autorisations appropriées pour ce type de service. Par exemple, lorsque vous créez un service de premier plan de type microphone, le système d'exploitation vérifie que votre application dispose actuellement de l'autorisation RECORD_AUDIO. Si vous ne disposez pas de cette autorisation, le système génère une exception SecurityException.

Pour les autorisations d'utilisation, cela peut poser problème. Si votre application dispose d'une autorisation "si l'application est ouverte", elle ne dispose de cette autorisation que lorsque l'application est au premier plan. Cela signifie que si votre application est en arrière-plan et qu'elle tente de créer un service de premier plan de type appareil photo, position ou micro, le système voit que votre application ne dispose pas actuellement des autorisations requises et génère une erreur SecurityException.

De même, si votre application s'exécute en arrière-plan et qu'elle crée un service de santé qui nécessite l'autorisation BODY_SENSORS, elle ne dispose pas actuellement de cette autorisation et le système génère une exception. (Cela ne s'applique pas s'il s'agit d'un service de santé nécessitant des autorisations différentes, comme ACTIVITY_RECOGNITION.) L'appel de PermissionChecker.checkSelfPermission() n'empêche pas ce problème. Si votre application dispose d'une autorisation "pendant l'utilisation" et qu'elle appelle checkSelfPermission() pour vérifier si elle dispose de cette autorisation, la méthode renvoie PERMISSION_GRANTED, même si l'application est en arrière-plan. Lorsque la méthode renvoie PERMISSION_GRANTED, cela signifie que votre application dispose de cette autorisation lorsque l'application est en cours d'utilisation.

Par conséquent, si votre service de premier plan a besoin d'une autorisation "si l'application est ouverte", vous devez appeler Context.startForegroundService() ou Context.bindService() lorsque votre application a une activité visible, sauf si le service fait partie de l'une des exceptions définies.

Exceptions aux restrictions concernant les autorisations en cours d'utilisation

Dans certains cas, même si un service de premier plan est démarré alors que l'application s'exécute en arrière-plan, il peut toujours accéder aux informations de localisation, de l'appareil photo et du micro lorsque l'application s'exécute au premier plan ("while-in-use").

Dans ces mêmes situations, si le service déclare un type de service de premier plan de location et est démarré par une application disposant de l'autorisation ACCESS_BACKGROUND_LOCATION, ce service peut accéder aux informations de localisation en permanence, même lorsque l'application s'exécute en arrière-plan.

La liste suivante contient ces situations:

  • Un composant système démarre le service.
  • Le service commence par interagir avec les widgets d'application.
  • Le service commence par interagir avec une notification.
  • Le service commence comme un PendingIntent envoyé à partir d'une autre application visible.
  • Le service est lancé par une application qui est un outil de contrôle des règles relatives aux appareils qui s'exécute en mode propriétaire de l'appareil.
  • Le service est démarré par une application qui fournit le VoiceInteractionService.
  • Le service est démarré par une application disposant de l'autorisation privilégiée START_ACTIVITIES_FROM_BACKGROUND.

Déterminer les services concernés dans votre application

Lorsque vous testez votre application, démarrez ses services de premier plan. Si un service lancé a un accès limité à la position, au micro et à la caméra, le message suivant s'affiche dans Logcat:

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