2011-04-10 (日)
*[Android] Androidアプリ内でFlashを使う
ニコニコPlayer(仮)の動画再生時にFlash Player 10がインストールされている場合は,Flashでflvの再生をするようにしようと思いつつ,放置していました.最近Flashの動作を確認していた感じだと出来そうな気がしてきたので,今日こそはと思って試してみる.
AndroidアプリでFlashを呼び出すにはWebViewを使うのが楽です.
この辺がサンプルもあって分かりやすい.
JavaScriptとプラグインを有効に
WebViewのデフォルト設定ではJavaScriptやFlash等のプラグインは呼び出されないようになっているので設定します.
mWebView = (WebView) new WebView(this);
WebSettings settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setPluginsEnabled(true);
mWebView.setScrollBarStyle(WebView.SCROLLBARS_INSIDE_OVERLAY);
ついでに,スクロールバー用のスペースが余白にならないようにsetScrollBarStyle()で設定しておきます.
WebViewをlayoutに入れないでコード上でインスタンスを作ってるのですが,わけは後で説明.
Flashの上に他のViewを載せる
これが一番困りました.
FlashのSurfaceViewはWebViewの中にあるのではなく,Windowの上に重なっていました.FlashPaintSurfaceというのも存在しているのですがイマイチ分からない.このせいで,Flashの表示の上に別のViewを置けなくて試行錯誤してたのだけど,Flash読み込み後に,WindowManagerにViewを登録すれば上に重ねることが出来た.
今回はWebViewを別に作っておいて,WindowManagerに直接登録.
今回は,ActivityのViewを上に載せたいので,背景を透明にして一旦削除してまた追加してやれば手前に表示される.
getWindow().setBackgroundDrawable(null); WindowManager.LayoutParams lp = (WindowManager.LayoutParams) getWindow().getDecorView().getLayoutParams(); lp.type = WindowManager.LayoutParams.TYPE_APPLICATION; getWindowManager().removeView(getWindow().getDecorView()); getWindowManager().addView(getWindow().getDecorView(), lp);
FlashのSurfaceViewが追加されるタイミングが読み込み完了時で良いのか分からないけど,これが一番楽そう.
もうちょっと良い方法あるかもしれないけど,今回は妥協.
ExternalInterfaceで色々
/sdcard/とかに置いたswfだと,ExternalInterfaceが上手く動かせなかったので,ニコニコPlayer(仮)は,どうせ内部にHTTPプロキシ持ってるのでそれを使う.
もしかしたら,ContentProviderでも可能かもしれない.
JavaからActionScriptを呼ぶ
ExternalInterface.addCallbackで関数を登録しておいて, mWebView.loadUrl("javascript:document.getElementById('swf').hoge()");
みたいに,javascriptを経由して呼び出すしかなさそう.
ActionScriptからJavaを呼ぶ
addJavascriptInterface()で登録しておいたオブジェクトのメソッドを,AS3側からExternalInterface.call()で直接(?)呼べます.
色々できそう
アプリ内課金でFlashゲーム売って,アプリ側でポイントとか管理するのもありじゃないかなぁと思ってるのだけど,どこかやらないかな.
あと誰かコンパクトなニコ生再生アプリを….
使用例
FlashPlayer10がインストールされている環境では,flvな動画も再生できるようになった.
ただ,FlashとAndroidアプリの同期がいまいちでコメントのスクロールがかなり不安定.
とりあえず再生できたという話なので,ちゃんと動くようにするのはまだ時間がかかりそう.