Lié service de crash avec “Contexte.startForegroundService() n'a pas alors d'appel de Service.startForeground()” erreur
Je suis actuellement en train de travailler sur la lecture audio app et je suis à l'aide d'un a commencé lié service à jouer de la musique en arrière-plan. Je commence et se lient au service à l'aide de code suivant.
val intent = Intent(context, MusicService::class.java)
context.startService(intent)
context.bindService(intent, serviceConnection, 0)
Il sera promu au premier plan lors de la lecture et obtient rétrogradé lorsque la musique est en pause.
//onAudioPlay
service.startForeground(NOTIFY_ID, notification)
//onAudioPause
service.stopForeground(false)
Service fonctionne bien jusqu'à maintenant. Mais lorsque la notification est lue(supprimé) par l'utilisateur dans l'état de pause, le service tombe en panne après quelques secondes de donner à cette erreur.
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myplayer, PID: 4380
android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground()
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1775)
android.os.Handler.dispatchMessage(Handler.java:105)
android.os.Looper.loop(Looper.java:164)
android.app.ActivityThread.main(ActivityThread.java:6541)
java.lang.reflect.Method.invoke(Native Method)
com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Cela se produit uniquement sur les biscuits Oreo et j'ai déjà lu sur le fond de limitations dans la de biscuits Oreo. Mais les points suivants qui me dérange.
- Ce service est lié service(qui ne sont pas touchés par les limitations)
- Je n'ai jamais utiliser le Contexte.startForegroundService() pour démarrer le service.(et ne veulent pas l'utiliser)
- Le service ne plante pas quand il fait rétrogradé de premier plan, qui se passe lors du retrait de la notification.
Pourquoi le service est de s'écraser? Ce que je fais mal? Je suis très reconnaissant si quelqu'un me dire ce qui se passe ici.
Merci pour la suggestion. J'ai ajouté une réponse.
OriginalL'auteur UdeshUK | 2017-12-02
Vous devez vous connecter pour publier un commentaire.
De s'étendre sur les UdeshUk réponse - toute utilisation de
MediaButtonReceiver
(bâtiment, dans l'attente d'intentions ou juste recevoir bouton média intentions) peut entraîner votre service appelé avecstartForegroundService
, parce queMediaButtonReceiver.onReceive
commence à votre service dans qui sur la façon de biscuits Oreo. Je n'ai pas vu ce document n'importe où.OriginalL'auteur Andy S
Vous devez appeler cette méthode à l'intérieur de votre classe de Service onCreate() méthode:->
OriginalL'auteur Ramkailash
J'ai trouvé le problème. Dans mon avis de passage, j'ai mis
Ainsi, lorsque l'utilisateur supprime la notification des appels startForegroundService() parce que j'ai appelé stopForeground() précédemment lors de la pause.
À surmonter, j'ai utilisé une coutume dans l'attente de l'intention et de la gérer dans le
onStartCommand()
au lieu de MediaButtonReveiver de PendingIntentla ligne ci-dessus crée un
PendingIntent
qui cible lesMediaButtonReceiver
, qui peut ensuite appeler votre service avecstartForegroundService
(qui dépend aussi de la façon dont vous avez configuré votre intention de filtres dans le manifeste). Donc, la meilleure solution pour éviter cesstartForegroundService
-appels est pour éviter leMediaButtonReveiver
, voir stackoverflow.com/a/50629196/1394330OriginalL'auteur UdeshUK
De la documentation 8.0 Les Changements De Comportement
Donc, vous devez appeler startForeground à l'intérieur onCreate() de votre service.
OriginalL'auteur lakshman.pasala