2011-04-30 (土)
ysaotome,eldeshと品川で夕食.
この日記はフィクションです.登場する人名・団体名・地名・職業などはぜんぶ架空のものです. なので実際のものとは何も関係がありません. それから,写真のように見える画像はCGもしくは念写によるものです.
ysaotome,eldeshと品川で夕食.
寝る日.
休み中に席とか変わるので,席替えのための引越し準備.
致命的っぽいバグを優先して色々修正.
以下メモ.
あとでソースを読んでみるつもりですが,画面回転時にListViewが一番下にスクロールしてしまうことがあるのって,何なのだろう.よく分からないので,onConfigurationChanged()で現在の位置を一旦取得して,setListAdapter()しなおしてから,位置を再設定するということをしている.
たまに動画の表示サイズがレイアウト変更に追従してくれない問題が再発してます.以前は自分でもってるVideoViewだったのでなんとかなりましたが,FlashPlayerが持ってるSurfaceViewは同じ方法ではいけなかった….一度,WindowManager上に何か追加してやればリサイズされるけど,どのタイミングでやればいいのかと,もうちょっとまともな方法がないかを探し中.
Caused by: java.lang.IllegalArgumentException: Comparison method violates its general contract! at java.util.TimSort.mergeLo(TimSort.java:743) at java.util.TimSort.mergeAt(TimSort.java:479)
この例外の原因を調べていたら,どうもComparatorが矛盾した結果を返すとダメっぽい.
例えば
return a<b ? -1 : 1;
という値を返していたとすると,xとyの大きさが等しい場合,(a,b) = (x,y)のときは,x>yという結果を返し,(a,b) = (y,x) のときに x<yとなってしまう.
等しい場合は0とするか,大小は分かっても等号を実装するのが面倒な場合,前回と同じ結果を返すように工夫する必要があります.
flv対応したら,(仮)から(β)にしようと思ってたのだけど,もう(仮)もアプリ名の一部になってしまってるしこのままでいこう.特徴のない名前にしてしまったのがいけなかった.
あと,CalledFromWrongThreadExceptionがたまにおきてたのだけど,どうしても問題になりそうなところが見つからず,どうやらAdMobのSDKが原因のようだというところまでたどり着いた.4.0.4で直ったりするのかな.
久しぶりにadmobにログインしたら,adSenseの広告を有効にしますか?みたいなことを聞かれたので有効にしてみた.AdSenseの利用規約に同意して,利用するように設定変更するだけでした.そもそも,adSenceとadmob分かれている理由が良くわからないけれど.
そして
admobからAndroidマグカップが届きました.先月参加したadmobのセミナーで応募したものです.参加者で実際にadmobを利用した人の中から50人という話だった気がするので,きっと貰えると思ってましたが,うれしいです.これが欲しくてadmobの広告を使ってみる決心をしたという気がしないでもないです.
取っ手の穴にスプーンを挿せるのがとても良いです.
探してみたら一応普通に買えるみたいですね.
http://www.google-store.com/product_info.php?products_id=1484
値段は高くないですが,日本で買うと送料とかでけっこう取られそう.
毎週,月曜日には早めに出社して生活をリセットしようとしているのだけど,金曜日までには戻ってしまうなぁ.15時出社はさすがに良くないという雰囲気が漂い始めてる気がするのでどうにかしたいところ.
CyanogenMod7にアップデートしたら再生できないmp4が増えた気がしたので,/system/lib/libOmxVdec.soを見たら以前mp4が再生できなくて困ってたバージョンになっていたので,前のやつを上書きしておく.個人的には解決したけど,他の人は平気なのかなぁ.
携帯を充電しようと思ったら充電用のケーブルを探したが見当たらないので,そのへんにある5Vの電源でブレッドボードに載せて無理やり充電するということをここ1ヶ月くらいやっていることに気づいたので,新しいのを買ってきた.今年になってから2本も無くしてるなぁ.どこに行ってしまうんだろう.ついでに食材を買う.
御茶ノ水の豚野郎ってとこで豚丼食べた.一緒に行ったxgaさんに1000円借りた....ちゃんと返します.今日はちゃんとお金持ってたのに,1万円札が使えない券売機が悪いんですと言い訳.
とりあえず,今週中にやらないといけない仕事はやった気がする.
昨日の夜から今日の昼過ぎまでずっと作業してて眠いので寝る.
会社行ってご飯食べて,夜中にやらないといけないことがあるので,いったん帰って寝ておく.
shimobayashiの家でコード書く日.
ニコニコPlayer(仮)の動画再生時にFlash Player 10がインストールされている場合は,Flashでflvの再生をするようにしようと思いつつ,放置していました.最近Flashの動作を確認していた感じだと出来そうな気がしてきたので,今日こそはと思って試してみる.
AndroidアプリでFlashを呼び出すにはWebViewを使うのが楽です.
この辺がサンプルもあって分かりやすい.
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の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が追加されるタイミングが読み込み完了時で良いのか分からないけど,これが一番楽そう.
もうちょっと良い方法あるかもしれないけど,今回は妥協.
/sdcard/とかに置いたswfだと,ExternalInterfaceが上手く動かせなかったので,ニコニコPlayer(仮)は,どうせ内部にHTTPプロキシ持ってるのでそれを使う.
もしかしたら,ContentProviderでも可能かもしれない.
ExternalInterface.addCallbackで関数を登録しておいて, mWebView.loadUrl("javascript:document.getElementById('swf').hoge()");
みたいに,javascriptを経由して呼び出すしかなさそう.
addJavascriptInterface()で登録しておいたオブジェクトのメソッドを,AS3側からExternalInterface.call()で直接(?)呼べます.
アプリ内課金でFlashゲーム売って,アプリ側でポイントとか管理するのもありじゃないかなぁと思ってるのだけど,どこかやらないかな.
あと誰かコンパクトなニコ生再生アプリを….
FlashPlayer10がインストールされている環境では,flvな動画も再生できるようになった.
ただ,FlashとAndroidアプリの同期がいまいちでコメントのスクロールがかなり不安定.
とりあえず再生できたという話なので,ちゃんと動くようにするのはまだ時間がかかりそう.
たまにAdMobのレポート見てるのだけど,広告表示率の変化が大きすぎて他の傾向がさっぱり分からないな.一時的に表示率が急に上がったと思ったらまた戻ったし.
比較的安定しているクリック率(CTR)は最初少し高めでしたが,だいたい0.3%に落ち着きつつあります.あと,1000インプレッションあたりの収入(eCPM)は$0.3くらいか.
調べてみると少し低めだけど,広告出す場所は元々空いていたスペースで何も考えてないのでこんなものでしょうか.
ActionScript3とJavaScriptとJavaを使ったプログラムを書く.JavaとFlash間で直接やりとりできるか良くわからないので,間にJavaScriptを挟んだら結構面倒.
ActionScript3は割り切って使えば使えないこともないけど,JavaScriptとJavaの好きになれない部分を両方引き継いでる感じなのであまり凝ったことやりたくないな.
金曜日あたりから眠くて何もできなくて困っていたのですが,夜になって大分動けるようになった.
ふと体温測ってみたら熱が….
WebView等を経由してFlashを読み込んだりすると,Flashが手前に出てきてしまって表示を重ねられません.
気になっていたのでどうなってるのか少し調べてみました.
Flashを埋め込むと,FlashPaintSurfaceというViewが見えると思いますが,実はこれがレンダリングされているわけではなく,WindowManagerにSurfaceViewが独立して登録されてて,それに表示されています.
重ねるにはActivityのViewとして表示するのはあきらめるしか無いかなぁ.
試したらブラウザでもURLが表示される領域より手前に表示されるのだけど,セキュリティ的にまずいような・・・.もしかしてこの問題ってCyanogenModとか入れてるからなの?
眠い….