タグ『 Android 』

≒ Simple Kitchen timerの件

アプリ公開しました。
Simple Kitchen timer

開発で2週間、アイコンやスクショ作成、リリース前レポートの確認とかで3日掛かった。前のエントリで書いた通り、openGL処理部分は使いまわしなんで時間がかからなかったです。

今回ハマったのはタイマー処理。ほぼイディオムな次のようなコードなんだけど、

[code language=”java”]
Timer timer = null;
@Override
public boolean onDoubleTap(MotionEvent e) {
if(timer == null){
timer = new Timer(true);
timer.scheduleAtFixedRate(new mTimertask(activity,timer),0,100);
}else if(timer != null){
timer.cancel();
timer.purge();
timer = null;
}
return false;
}
[/code]
(だいぶ簡略化してます)

他のクラスからタイマーをキャンセルしても死なない(nullにならない)。コンストラクタやメソッドの引数で渡してそれをキャンセルしても死なん。
ググりまくって結構同じハマり方してる人いるみたいなんだけど、結局タイマー定義を

[code language=”java”]
  static Timer timer = null;
[/code]

にしたら上手く動くようになった。我ながらまだJavaの理解が浅いんだよなー。
他にもタイマー処理の色んなところでハマりまくりながらようやく公開寸前までたどり着いて、まだ問題が残ってたのでググりまくってたら(コピペプログラマだからね)、何やらキッチンタイマーみたいなアプリに最適なGoogle様謹製のクラスがあるような話を散見した。
今さら処理のコア部分を書き直すのはつらすぎ、悲しすぎたのでそっち方面の検索はしないまま自前の複雑怪奇なタイマー処理のまま押し切った。勉強になりました。

良かったら使ってみてください。コードの複雑さにしては単純なアプリです。
…クラッシュレポート上がってきたら全部書き直そう…

追記:ワロタw

OpenGL や Unity3D のフレームワークに基づくアプリ テスト用自動クローラは、OpenGL や Unity3D を使用するアプリの UI 要素を識別できません。テスト結果は、アプリの起動と数秒後のアプリの終了のテストに限られます。

≒ SimpleSecurityCameraの件

アプリ公開しました。
SimpleSecurityCamera

開発に2.5カ月掛かった。今までで最長かも。長くかかっただけはある出来映えかって?君は面白いこと訊くなー!?HAHAHAHAHAHA!!

デバイスの機能叩くのが難しいのはよく分かった。というかまだ心配なところがある。再現性のない落ち方するんだよね。でもデベコンの「リリース前レポート」にはだいぶ助けられた。たった3分だけど他機種で基本的なことで落ちるのは防げるようになった。

アプリの説明はしません。シンプルです。良かったら触ってみてください。バッテリー消耗するので注意。

次の(クソ)アプリはアイデアも固まってるんでサクッと作ろう思うんだけど、所有するライトアダ〇トサイトで使ってるDMMのAPIが7月末で旧バージョン終了してしまうので、3.0に移行しなきゃいけない。
サイトの見栄えも機能も全く変わらないのに手間かかるってめんどくさいなー。取りあえず苦労して対応した「謎のEUC-JP」「今さらXMLレスポンス」はそれぞれUTF8とjsonに正常化?してくれるのは良いんだけど、それは新規に始める人にしか意味ないような。取りあえずレスが重いのも同時に改善してくれれば良いんだけどな。

≒ android-Camera2Videoサンプルが録画ストップで落ちる件

最近は次のアプリ開発のためCamera2APIを勉強中。
googlesamplesのサンプルはAndroidStudioだと一発インポートですぐ動かせるんだけど、勉強のためあえて一から書き写してる。自分の中では写経と呼んでます。
で、ビデオ録画のサンプルのこれ写経して動かしてみたら、
録画終了ボタン押すとアプリごと落ちる。「java.lang.IllegalStateException: swapBuffers: EGL error: 0x300d」とか、「android.hardware.camera2.CameraAccessException: The camera device has encountered a serious error」とかでてるから、おま環の機種問題でこの端末(zenfone5)ではCamera2API使えないのかなと思ったんだけど、みんな大好きstackoverflowで解決策発見。リンク先のアンサー見れば解決策全部乗ってるんだけど、以下備忘のため書き残しておきます。一般的な機種ではこんなことにならないみたいだから、この対応のせいで逆に上手く動かない機種もあるかもしれない。後日それで嵌ったりしないため、こういう対応してるよってのを忘れないためです。

startRecordingVideo()で録画用にMediaRecorder.getSurface()で取得してCameraCaptureSessionに渡してるsurfaceは、MediaRecorder.stop()で自動的に破棄されるらしい。その時点でセッションが落ちて、それにつられてCameraDevice自体落ちる。なので録画プレビュー用のセッションをclosePreviewSession()で閉じようとしたところでCameraAccessExceptionでアプリ全体が死亡する。なのでCameraAccessExceptionが出る前に既にEGL errorでてアプリの処理は死んでるのね。これが原因。しかしこういう挙動をしない機種はどういう処理をしてるんだろうか。
で、対処としてはstopRecordingVideoではMediaRecorder.stop()をしないで、通常時のプレビューセッションのStateCallbackのonReadyでMediaRecorder.stop()とreset()をしています。

最初は録画用のプレビューセッションのStateCallback、onClosedでやろうとしたんだけど、何故かonClosedは走らず、MediaRecorderの多重起動で落ちちゃう。APIドキュメント(android.hardware.camera2.CameraCaptureSession)を読むと、onClosedは自分で閉じた場合には呼ばれないみたい。

This method is called when the session is closed.
A session is closed when a new session is created by the parent camera device, or when the parent camera device is closed

なので通常プレビューに戻ったときのonReadyでやってます。フラグはmIsRecordingVideoを流用。

以上備忘でした。もしこのエントリ読んで理解したい人がいたらサンプルコード併読してください。というか同じようにサンプル走らせて見て落ちて困ってる人しかこのエントリ見ないかw