J'ai un fichier audio jouant dans un service de premier plan à l'aide de MediaPlayer. Lorsqu'un utilisateur tape la notification associée au service de premier plan, je lance une activité à l'aide de l'intention, comme:
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? at android.view.ViewRoot.setView(ViewRoot.java:527) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) at android.view.Window$LocalWindowManager.addView(Window.java:424) at android.widget.MediaController.show(MediaController.java:304) at android.widget.MediaController.show(MediaController.java:249) at com.myapp.AudioPlayActivity$AudioServiceConnection.onServiceConnected(AudioPlayActivity.java:295)
5 Réponses :
Je pense que vous appelez show () code> trop tôt, avant que l'activité précédente termine le cycle de vie.
BadTokenException CODE> peut être évité en retardant l'appel à
Afficher () code> jusqu'à ce que toutes les méthodes de cycle de vie soient appelées. Vous pouvez poster un différé différé pour cela. Ou vous pouvez essayer de suivre,
Effectivement cela semble être le problème, mais mettre un retard arbitraire sur une runnable semble être une mauvaise chose. Cela semble que cela pourrait être un bug dans le système d'exploitation alors, car il n'y a pas de documentation sur cette limitation nulle part. Je ne pense pas que votre méthode isfinissante () fonctionnera cependant parce que c'est une instance d'activité différente.
Ritesh Gune a raison, mais pour éviter le retard, vous pouvez placer le spectacle à l'intérieur de la méthode OnattachedTowindow appelée après que toutes les méthodes de cycle de vie sont appelées.
Je crois que le problème est dans cette ligne.
AudioPlayActivity.this.audioService = audioServiceBinder.getAudioService();
Intérieur Au lieu d'utiliser Déclarez une vue globale code> variable: p> modification ceci devrait se débarrasser de la fenêtre excuses si j'ai mal compris le question. p> p> Audioplayactivity's Code>
Oncreate (Bundle) Code>:
SetContentView (int) code>, gonfler la mise en page (si vous êtes déjà Faire cela, sauter à l'avance): p>
audioviceconnection code > Pour ce qui suit: p>
BadTokenException code>. P>
Dans les étapes que vous avez mentionnées, il semble Pour confirmer l'instance Fuite, Place: P> onconnected () code> est invoqué sur une instance de fuites d'activité précédente créée à l'étape 1. Si le service est à la demande (service lié), vous devriez alors Bind / Bidind dans
Onresume () Code> /
Onpaause () Code> respectivement.
log.i("LEAKTEST", "Connected to instance " + this.toString());
J'ai aussi eu le même problème et la corrigée en procédant comme suit, p> maintenant, cela fonctionne comme un charme. P> h2>
Pourquoi cela a-t-il été évolué?
avez-vous essayé mymediaplayer.setdisplay (mysurface)
@Satellitesd Non, mais ce n'est qu'un fichier audio. En outre, il n'y a pas de surface car l'instance MediaPlayer est en cours d'exécution dans un service.
oups semble être comme j'ai mal interprété votre question :(
"C'est particulièrement difficile parce que je ne peux pas le recréer!" Juste à cause de votre appareil Préparez d'abord le lecteur multimédia, puis à afficher le contrôleur multimédia, essayez de vous reproduire dans des périphériques de configuration inférieurs, cela vous aidera à clouer ce problème.
@ NJZK2 MediaController est défini comme une variable de membre de l'audioplayactivité et est instanciée dans l'activatee de l'activité.
Apparemment, vous essayez d'afficher le MediaController, mais votre activité n'est pas prête ou ne peut pas l'afficher.
Votre exception est dans une méthode code> code>, pas dans le
oneserviceconnected code>
@ njzk2 désolé, cette stacktrace est ancienne. Je vais le mettre à jour. J'avais essayé de mettre MediaController.Show () dans un gestionnaire pour voir si cela vous aiderait, ce que cela n'a pas fait.
Selon le journal d'erreur, vous avez une référence ou un jeton NULL exécuté dans votre code. Veuillez indiquer d'abord la référence nulle en entourant chaque référence d'objet dans une instruction IF indiquant le NULL en l'imprimant au journal ou à une autre manière si possible.
@yekhezelyovel Le pointeur NULL est de quelque chose dans la classe MediaController, pas mon code.