web-dev-qa-db-fra.com

Refus de permission: startForeground requiert Android.permission.FOREGROUND_SERVICE

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 essaie de déplacer un service de commentaire audio au premier plan avec une notification multimédia et tout le reste.

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)
133
Roy Solberg

C'est ce que vous obtenez pour ne pas lire les notes de version correctement. Cela a commencé lors du réglage de targetSdkVersion = 28 (Android 9/Pie) et est clairement indiqué, par exemple, dans. les notes de migration :

Les applications souhaitant utiliser des services de premier plan doivent désormais demander d'abord l'autorisation FOREGROUND_SERVICE. Il s’agit d’une autorisation normale. Le système l’accorde donc automatiquement à l’application demandeuse. Le démarrage d'un service de premier plan sans autorisation lève une exception SecurityException.

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

<manifest ...>
     ...
     <uses-permission Android:name="Android.permission.FOREGROUND_SERVICE" />
     ...
     <application ...>
     ...
</manifest>
277
Roy Solberg

Refus de permission: startForeground requiert Android.permission.FOREGROUND_SERVICE

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

Alors maintenant, nous devons ajouter permission du service de premier plan dans le fichier manifeste

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

ÉCHANTILLON

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

FOREGROUND_SERVICE étant une autorisation normale, le système la concède automatiquement à l'application demanderesse.

Cochez les notes de migration de Android 9/Pie

  • Changer

Autorisation de service de premier plan

  • Résumé

Les applications souhaitant utiliser des services de premier plan doivent désormais demander d'abord l'autorisation FOREGROUND_SERVICE. Il s’agit d’une autorisation normale. Le système l’accorde donc automatiquement à l’application qui en fait la demande. Le démarrage d'un service de premier plan sans autorisation lève une exception SecurityException.

Lire aussi startForeground()

  • Les API de ciblage d'applications Build.VERSION_CODES.P ou version ultérieure doivent demander l'autorisation Manifest.permission.FOREGROUND_SERVICE pour pouvoir utiliser cette API.
29
Nilesh Rathod