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

Ballsの件

昨日Androidアプリ新作公開しました。
Balls

我ながらクソみたいに単純なopenGLのデモなんだけど一ヶ月と10日も製作に費やした。面白かった。
デモだけど広告入れました。お金欲しいもあるんだけど、ユーザさんの動きがある程度分かるんですよね。アナリティクス入れればもっと詳しく分かるんだろうけど、ColorExtractorに入れたのは上手く動いてないんです。今度もう一度ちゃんと設定してみよう。

3D衝突計算は「ActionScript 3.0 アニメーション」にお世話になりました。中古で無料配送だったから1000円以下で手に入って助かったw なんでActionScript?とは思うけど、色々ぐぐったりした中で一番説明が分かりやすかった。計算式には言語関係ないしね。

一番苦労したのはボールをダブルタップで追加/削除の部分。three.jsならRayCasterクラスがあるから簡単なんだけど、今回もフレームワークは使いたくなかったので(たぶんUnityとか使えばそういうのあるよね)、試行錯誤しながら自作ロジック組んだ。といっても教科書(OpenGL ES 2.0 Androidグラフィックスプログラミング)の「9.2物体を選択する」の手法を拡張しただけですけどね。追加は目に見えてるワイヤの立方体よりちょっと小さい立方体とxyz軸に沿って平面立てて、glReadPixelsしてる。タイミングがシビアで苦労した。ボールの番号はrgb値使って、r=100の桁、g=10の桁、b=1の桁を入れてます。openGLはr値は5ビットなので32まで数えられるから、ボールの最大数は3200のはず。はずって言うのはその数に達する前にCPUかメモリの限界で落ちるだろうから。Playストアにスクショで張ってるけど、300個くらいまでなら一応滑らかに動きます。機種によりますけどね。

以上、言葉足らずの説明ですみません。早く次のアプリ作り始めたいんだよねw アプリ公開報告でした。

jawiki/latest 20160407/ のページ数の件>2045044

ひと月空いたから1万レコード以上増えてる。

この投稿しようとwordpressのダッシュボード空けたら4.5アップグレードのお知らせあり。
当然すぐ更新。途中で死ぬ。アップグレードが死ぬだけじゃなく、ブログ自体死ぬ。
面倒なんでwp-includesフォルダのファイル一式だけサーバに上げて上書き。無事復活。
いやいや。wp-includes内の孫フォルダやwp-adminは何もしてない。プラグインも一時停止せずにやった。
これで無事に終わるわけがない。とりあえず次の更新が楽しみ。また死んだら今度こそちゃんとマニュアルアップグレードします。
それとも自分でブログシステム作るかな。めちゃシンプルなやつで良いから。あ、このサーバはJava走らせられないんだっけ。phpで作るのはいやだなぁ。