11
votes

Impossible de corriger les médiascontroller.Show ()

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)


11 commentaires

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 , pas dans le oneserviceconnected


@ 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.


5 Réponses :


7
votes

Je pense que vous appelez show () trop tôt, avant que l'activité précédente termine le cycle de vie. BadTokenException peut être évité en retardant l'appel à Afficher () 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, xxx


2 commentaires

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.



1
votes

Je crois que le problème est dans cette ligne.

AudioPlayActivity.this.audioService = audioServiceBinder.getAudioService();


0 commentaires

0
votes

Intérieur Audioplayactivity's Oncreate (Bundle) :

Au lieu d'utiliser SetContentView (int) , gonfler la mise en page (si vous êtes déjà Faire cela, sauter à l'avance):

Déclarez une vue globale variable: xxx

modification audioviceconnection Pour ce qui suit: xxx

ceci devrait se débarrasser de la fenêtre BadTokenException .

excuses si j'ai mal compris le question.


0 commentaires

0
votes

Dans les étapes que vous avez mentionnées, il semble 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.

Pour confirmer l'instance Fuite, Place: P>

log.i("LEAKTEST", "Connected to instance " + this.toString());


0 commentaires

6
votes

Correction du problème

J'ai aussi eu le même problème et la corrigée en procédant comme suit, xxx

maintenant, cela fonctionne comme un charme.


0 commentaires