Refus d'autorisation: startForeground nécessite android.permission.FOREGROUND_SERVICE

195

Dernièrement, nous avons soudainement vu quelques-unes des traces de pile suivantes. Pourquoi cela pourrait-il être? C'est à partir du moment où l'application tente de déplacer un service de commentaires audio au premier plan avec une notification multimédia et tout.

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)
Roy Solberg
la source

Réponses:

413

Cela se produira si vous avez défini targetSdkVersion = 28(Android 9 / Pie) ou supérieur et n'avez pas déclaré l'utilisation de l' FOREGROUND_SERVICEautorisation.

À partir des notes de migration pour Android 9:

Les applications qui souhaitent utiliser les services de premier plan doivent maintenant demander l'autorisation FOREGROUND_SERVICE en premier. Il s'agit d'une autorisation normale, le système l'accorde donc automatiquement à l'application qui fait la demande. Le démarrage d'un service de premier plan sans l'autorisation lève une SecurityException.

La solution consiste simplement à ajouter ce qui suit dans AndroidManifest.xml:

<manifest ...>
     ...
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
     ...
     <application ...>
     ...
</manifest>
Roy Solberg
la source
8
Cela signifie-t-il que si notre targetSdkVersionest inférieur à 28, nous n'avons pas besoin d'autorisation pour exécuter les services Foreground sur les appareils exécutant 28?
3
Cela me semble être une solution étrange, abaisser la cibleSdkVersion
Denny
2
@Sjd Ils s'installeront très bien. Ce n'est pas comme ça maxSdkVersion.
Roy Solberg
9
Faire voter votre réponse, mais les notes de publication ne sont pas une excuse pour créer des API non rétrocompatibles. Dans ce cas, Google aurait pu demander à un utilisateur de donner la permission ou au moins de fournir un indice au lieu de planter l'application en silence. Android devient très difficile à maintenir ces derniers temps.
Oleg Gryb
2
@miladsalimi Si vous ouvrez AndroidManifest.xml dans Android Studio, vous pouvez choisir de voir le "manifeste fusionné". Peut-être y a-t-il une dépendance qui injecte cette utilisation des autorisations pour vous?
Roy Solberg
43

Refus d'autorisation: startForeground nécessite android.permission.FOREGROUND_SERVICE

Les applications qui ciblent Android 9 (niveau d'API 28) ou supérieur et utilisent des services de premier plan doivent demander l'extension FOREGROUND_SERVICE permission.

Nous devons maintenant ajouter l' autorisation de service Foreground dans le fichier manifeste

  • il permet à une application régulière d'utiliser Service.startForeground

ÉCHANTILLON

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

FOREGROUND_SERVICE est une autorisation normale, le système l'accorde donc automatiquement à l'application qui fait la demande.

Vérifiez ceci les notes de migration d'Android 9 / Pie

  • Changement

Autorisation de service au premier plan

  • Résumé

Les applications qui souhaitent utiliser les services de premier plan doivent maintenant demander l'autorisation FOREGROUND_SERVICE en premier. Il s'agit d'une autorisation normale, le système l'accorde donc automatiquement à l'application qui fait la demande. Le démarrage d'un service de premier plan sans l'autorisation lève une SecurityException.

Lire aussi startForeground()

  • L'API de ciblage des applications Build.VERSION_CODES.Pou une version ultérieure doit demander l'autorisation Manifest.permission.FOREGROUND_SERVICEpour utiliser cette API.
Nilesh Rathod
la source
monsieur, j'ai essayé votre solution mais cela ne fonctionne pas pour moi pour tous les appareils Android.Comme dans Oppo F11 Pro, cela fonctionne mais dans l'application Samsung, Nokia et Mi Phone est en panne et a la même erreur dans le journal.Pouvez-vous me dire ce que je fais pour réparer?
Kapil soni le
@Kapilsoni `a la même erreur dans le journal` quelle erreur vous obtenez
Nilesh Rathod
J'ai eu cette erreur "android.app.RemoteServiceException: Mauvaise notification pour startForeground:"
Kapil soni le
8

Pour l'API de niveau 28 ou supérieur, il nécessite l'autorisation FOREGROUND_SERVICE. Sinon, il ne peut pas fonctionner et a obtenu une exception.

Il sera résolu en ajoutant

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

dans le fichier AndroidManifest.xml.

Zaman
la source
J'ai ajouté mais pas corrigé pour moi
Kapil soni
@Kapilsoni même problème pour moi, ajouté mais plante toujours en raison d'une autorisation insuffisante sur l'API 29, avez-vous réussi à le résoudre?
ArturM
4

Une valeur targetSdkVersiond'au moins 28sera obligatoire à partir du 1er novembre 2019 pour les mises à jour d'applications dans le Play Store. Vous devrez donc modifier l'API cible, puis demander l'autorisation FOREGROUND_SERVICEd'éviter le plantage surstartForeground()

Hermano Mclintock
la source
0

Notant que FOREGROUND_SERVICEcela ne nécessite pas d'exigence d'autorisation d'exécution. ajouter seulement ci-dessous aux manifestes

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

la ligne ci-dessus doit être ajoutée avant <application

Atef Farouk
la source