Negazione autorizzazione: startForeground richiede android.permission.FOREGROUND_SERVICE


195

Ultimamente abbiamo improvvisamente visto alcune delle seguenti tracce dello stack. Perché potrebbe essere? Questo è quando l'app tenta di spostare un servizio di commento audio in primo piano con una notifica multimediale e tutto il resto.

java.lang.SecurityException: Permission Denial: startForeground from pid=1824, uid=10479 requires android.permission.FOREGROUND_SERVICE
    at android.os.Parcel.createException(Parcel.java:1942)
    at android.os.Parcel.readException(Parcel.java:1910)
    at android.os.Parcel.readException(Parcel.java:1860)
    at android.app.IActivityManager$Stub$Proxy.setServiceForeground(IActivityManager.java:5198)
    at android.app.Service.startForeground(Service.java:695)
    at com.example.app.services.AudioService.setUpMediaNotification(AudioService.java:372)
    at com.example.app.services.AudioService.setUpAndStartAudioFeed(AudioService.java:328)
    at com.example.app.services.AudioService.onStartCommand(AudioService.java:228)
    at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3667)
    at android.app.ActivityThread.access$1600(ActivityThread.java:199)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1681)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
 Caused by: android.os.RemoteException: Remote stack trace:
    at com.android.server.am.ActivityManagerService.enforcePermission(ActivityManagerService.java:9186)
    at com.android.server.am.ActiveServices.setServiceForegroundInnerLocked(ActiveServices.java:1189)
    at com.android.server.am.ActiveServices.setServiceForegroundLocked(ActiveServices.java:870)
    at com.android.server.am.ActivityManagerService.setServiceForeground(ActivityManagerService.java:20434)
    at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:976)

Risposte:


413

Ciò accadrà se hai impostato targetSdkVersion = 28(Android 9 / Pie) o versioni successive e non hai dichiarato l'utilizzo FOREGROUND_SERVICEdell'autorizzazione.

Dalle note sulla migrazione per Android 9:

Le app che desiderano utilizzare i servizi in primo piano devono ora richiedere prima l'autorizzazione FOREGROUND_SERVICE. Questa è un'autorizzazione normale, quindi il sistema lo concede automaticamente all'app richiedente. L'avvio di un servizio in primo piano senza l'autorizzazione genera SecurityException.

La soluzione è semplicemente aggiungere quanto segue in AndroidManifest.xml:

<manifest ...>
     ...
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
     ...
     <application ...>
     ...
</manifest>

8
Ciò significa che se il nostro targetSdkVersionè inferiore a 28, non abbiamo bisogno di alcuna autorizzazione per eseguire i servizi di Foreground nei dispositivi che eseguono 28?

3
Sembra una strana soluzione per me, abbassare il bersaglioSkkVersion
Denny

2
@Sjd Si installeranno bene. Non è così maxSdkVersion.
Roy Solberg,

9
Vota la tua risposta, ma le note di rilascio non sono una scusa per la creazione di API compatibili non arretrate. In questo caso Google avrebbe potuto chiedere a un utente di autorizzare o almeno fornire un suggerimento invece di arrestare in modo anomalo l'app in modo silenzioso. Android diventa molto difficile da mantenere ultimamente.
Oleg Gryb,

2
@miladsalimi Se apri AndroidManifest.xml in Android Studio puoi scegliere di vedere il "manifest unito". Forse c'è una dipendenza che ti inietta quel permesso?
Roy Solberg,

43

Negazione autorizzazione: startForeground richiede android.permission.FOREGROUND_SERVICE

Le app destinate ad Android 9 (livello API 28) o superiore e che utilizzano servizi in primo piano devono richiedere il FOREGROUND_SERVICE permission.

Quindi ora dobbiamo aggiungere l' autorizzazione del servizio Foreground nel file manifest

  • Permette l'utilizzo di un'applicazione normale Service.startForeground

CAMPIONE

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

FOREGROUND_SERVICE è un'autorizzazione normale, quindi il sistema lo concede automaticamente all'app richiedente.

Dai un'occhiata alle note sulla migrazione di Android 9 / Pie

  • Modificare

Autorizzazione al servizio in primo piano

  • Sommario

Le app che desiderano utilizzare i servizi in primo piano devono ora richiedere prima l'autorizzazione FOREGROUND_SERVICE. Questa è un'autorizzazione normale, quindi il sistema lo concede automaticamente all'app richiedente. L'avvio di un servizio in primo piano senza l'autorizzazione genera SecurityException.

Leggi anche startForeground()

  • Le app con targeting API Build.VERSION_CODES.Po successive devono richiedere l'autorizzazione Manifest.permission.FOREGROUND_SERVICEper utilizzare questa API.

signore, ho provato la tua soluzione ma non funziona per me per tutti i dispositivi Android. risolvere?
Kapil soni,

@Kapilsoni `ha avuto lo stesso errore nel registro` quale errore stai ricevendo
Nilesh Rathod

ho ricevuto questo errore "android.app.RemoteServiceException: notifica errata per startForeground:"
Kapil soni

8

Per livello API 28 o superiore, richiede l'autorizzazione FOREGROUND_SERVICE. Altrimenti, non può funzionare e ha ottenuto un'eccezione.

Sarà risolto aggiungendo

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

nel file AndroidManifest.xml.


ho aggiunto ma non risolto per me
Kapil soni,

@Kapilsoni stesso problema per me, aggiunto ma ancora crash a causa dell'insufficiente autorizzazione su API 29, sei riuscito a risolverlo?
ArturM

4

Una targetSdkVersiondi almeno 28sarà obbligatoria a partire dal 1 novembre 2019 per gli aggiornamenti app nel Play Store. Quindi dovrai modificare l'API di destinazione e quindi richiedere l'autorizzazione FOREGROUND_SERVICEper evitare l'arresto anomalostartForeground()


0

Notando che FOREGROUND_SERVICEnon richiede i requisiti di autorizzazione di runtime. aggiungi solo di seguito a manifest

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

la riga sopra dovrebbe essere aggiunta prima <application

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.