[Android]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とはなにか、という理解が足りていないようです。もう少し勉強しなければ。