TinyMediaPlayerの件

公開しました。
TinyMediaPlayer
制作に約3カ月もかかった。その割にはただのメディアプレイヤーなんですけど。

制作に3カ月もかかったのは初めてのUWP(C++/CX)コーディングだったという俺の能力不足がでかいんだけど、今回申請から公開まで1週間弱かかったのはびっくりした。
まず認定結果が出るまで3日かかった。そんで1回目は不合格。メディアデータにアクセスするアプリの場合プライバシーポリシー明示が必要らしい。事前にそういう基本的な情報がネットで引っかからないところがUWPアプリの寂しさ。
HTMLぺら一のプライバシーポリシー掲載サイト作ってリンクを所定の位置に記入して再申請。今度は2日で認定処理終了。合格。デベロッパーセンターの表示が「公開中」になるもストアに出てこない。良く見ると「ストア情報」とかいうのが「保留」になってる。ググってみると「公開中」という日本語表記はen表示だと「公開準備中」という内容に該当するらしい。2日経って「ストア内」という表記に代わって無事公開状態になった。最初の不合格別にしても、Androidに慣れた身からすると、すごく時間かかるんだなと思った。もちろん全く文句はない。MicroSoftさんの慎重さにはすごく好感が持てる。その慎重さとオープンソース化による諸々の更新がバッティングしちゃって、APIなどのドキュメントがカオス状態なのは何とかしてほしいと思うけども、アプリの「名前予約」ってシステムとかは良い慎重さだと思う。同名アプリがないってのはやっぱりうれしい。

以上、公開報告。良かったら使ってみてください。広告もネットアクセスも無いので軽いはずです。というかそれだけを目的に作りました。よろしく。

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