Limitazioni relative all'avvio di un servizio in primo piano dal background

Le app che hanno come target Android 12 (livello API 31) o versioni successive non possono avviare servizi in primo piano mentre l'app è in esecuzione in background, ad eccezione di alcuni casi speciali. Se un'app tenta di avviare un servizio in primo piano mentre è in esecuzione in background e il servizio in primo piano non soddisfa uno dei casi eccezionali, il sistema genera un'eccezione ForegroundServiceStartNotAllowedException.

Inoltre, se un'app vuole avviare un servizio in primo piano che richiede autorizzazioni durante l'uso (ad esempio, autorizzazioni per sensori del corpo, fotocamera, microfono o posizione), non può creare il servizio mentre è in background, anche se rientra in una delle esenzioni dalle limitazioni di avvio in background. Il motivo è spiegato nella sezione Limitazioni all'avvio di servizi in primo piano che richiedono autorizzazioni per l'utilizzo.

Esenzioni dalle limitazioni relative all'avvio in background

Nelle seguenti situazioni, la tua app può avviare servizi in primo piano anche mentre è in esecuzione in background:

Limitazioni all'avvio di servizi in primo piano che richiedono autorizzazioni per l'utilizzo

Su Android 14 (livello API 34) o versioni successive, esistono situazioni speciali di cui tenere conto se avvii un servizio in primo piano che richiede autorizzazioni durante l'uso.

Se la tua app ha come target Android 14 o versioni successive, il sistema operativo controlla quando crei un servizio in primo piano per assicurarsi che la tua app disponga di tutte le autorizzazioni appropriate per quel tipo di servizio. Ad esempio, quando crei un servizio in primo piano di tipo microphone, il sistema operativo verifica che la tua app disponga attualmente dell'autorizzazione RECORD_AUDIO. Se non disponi di questa autorizzazione, il sistema genera un errore SecurityException.

Per le autorizzazioni "Mentre l'app è in uso", questo causa un potenziale problema. Se la tua app dispone di un'autorizzazione durante l'uso, ha questa autorizzazione solo quando è in primo piano. Ciò significa che se la tua app è in background e tenta di creare un servizio in primo piano di tipo fotocamera, posizione o microfono, il sistema rileva che la tua app non dispone attualmente delle autorizzazioni richieste e genera un'eccezione SecurityException.

Analogamente, se la tua app è in background e crea un servizio per la salute che richiede l'autorizzazione BODY_SENSORS, l'app non dispone attualmente di questa autorizzazione e il sistema genera un'eccezione. (Questo non si applica se si tratta di un servizio per la salute che richiede autorizzazioni diverse, come ACTIVITY_RECOGNITION.) La chiamata a PermissionChecker.checkSelfPermission() non impedisce questo problema. Se la tua app dispone di un'autorizzazione durante l'uso e chiama checkSelfPermission() per verificare se dispone di questa autorizzazione, il metodo restituisce PERMISSION_GRANTED anche se l'app è in background. Quando il metodo restituisce PERMISSION_GRANTED, significa che l'app dispone di questa autorizzazione mentre è in uso.

Per questo motivo, se il tuo servizio in primo piano richiede un'autorizzazione durante l'uso, devi chiamare Context.startForegroundService() o Context.bindService() mentre la tua app ha un'attività visibile, a meno che il servizio non rientri in una delle esenzioni definite.

Esenzioni dalle limitazioni relative alle autorizzazioni durante l'uso

In alcune situazioni, anche se un servizio in primo piano viene avviato mentre l'app viene eseguita in background, può comunque accedere alle informazioni sulla posizione, sulla fotocamera e sul microfono mentre l'app viene eseguita in primo piano ("durante l'uso").

In queste stesse situazioni, se il servizio dichiara un tipo di servizio in primo piano location e viene avviato da un'app che dispone dell'autorizzazione ACCESS_BACKGROUND_LOCATION, questo servizio può accedere ai dati sulla posizione in qualsiasi momento, anche quando l'app viene eseguita in background.

L'elenco seguente contiene queste situazioni:

  • Un componente di sistema avvia il servizio.
  • Il servizio inizia interagendo con i widget dell'app.
  • Il servizio inizia interagendo con una notifica.
  • Il servizio viene avviato come PendingIntent inviato da un'app diversa e visibile.
  • Il servizio viene avviato da un'app che è un controller dei criteri dei dispositivi che viene eseguito in modalità device owner.
  • Il servizio viene avviato da un'app che fornisce l'VoiceInteractionService.
  • Il servizio viene avviato da un'app con l'autorizzazione con privilegi START_ACTIVITIES_FROM_BACKGROUND.

Determina quali servizi sono interessati nella tua app

Durante il test dell'app, avvia i relativi servizi in primo piano. Se un servizio avviato ha un accesso limitato alla posizione, al microfono e alla fotocamera, in Logcat viene visualizzato il seguente messaggio:

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