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)
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>
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
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
Autorisation de service de premier plan
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()
Build.VERSION_CODES.P
ou version ultérieure doivent demander l'autorisation Manifest.permission.FOREGROUND_SERVICE
pour pouvoir utiliser cette API.