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