VideoViewでBadTokenException

エラーを書いておくと結構役に立つことが多いみたいですね。というわけで、エラーとその対処方法を書いておきます。

VideoViewでyoutubeの動画を再生させようとすると、こういうエラーが出ました。同様のエラーが他にWebViewなどでも生じるようです。

E/AndroidRuntime( 6263): android.view.WindowManager$BadTokenException:
Unable to add window -- token null is not for an application
E/AndroidRuntime( 6263):        at
android.view.ViewRoot.setView(ViewRoot.java:509)
E/AndroidRuntime( 6263):        at
android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
E/AndroidRuntime( 6263):        at
android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
E/AndroidRuntime( 6263):        at
android.app.Dialog.show(Dialog.java:241)
E/AndroidRuntime( 6263):        at
android.app.AlertDialog$Builder.show(AlertDialog.java:802)
E/AndroidRuntime( 6263):        at
android.widget.VideoView$4.onError(VideoView.java:387)
E/AndroidRuntime( 6263):        at
android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:1264)
E/AndroidRuntime( 6263):        at
android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 6263):        at
android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 6263):        at
android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime( 6263):        at
java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 6263):        at
java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 6263):        at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime( 6263):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)

悩んだのですが、

http://tech.shantanugoel.com/2010/07/08/badtokenexception-android-dialog-getapplicationcontext.html

を見て解決しました。

videoMain = new VideoView(getApplicationContext());

ではなく、

videoMain = new VideoView(this);

this、つまりActivityを渡すことでも問題がなくなりました。

Document上ではVideoViewのコンストラクタの引数は Context なんですがね。こういうことがあるんですね…。

getApplicationContext()で得られるcontextとはなにか、という理解が足りていないようです。もう少し勉強しなければ。