カメラ周りがエラーまみれ

 「ぞろぞろ」というタイトルのアプリを作り始めました。
device-2015-01-12-114341
 カメラ機能を使いたいので、以前作った「秘密のスライドパズル」のソースを利用・・
 ic_launcher-web
したところ、カメラ周りでエラーが出ていることが発覚し(うすうす気付いてい)ました。
 
 「秘密のスライドパズル」のカメラ(この先出てくる「カメラ」は android.hardware.Camera の方ね。org.andengine.engine.camera ではありません。)は、標準アプリを使わずに SurfaceView を継承した CameraPreviewSurfaceView を表示して、その上に背景を透明にした AndEngine の Scene を乗せています。画像は、カメラ機能の takePicture() を使わずに、プレビュー画面を取得して decodeYUV420SP() メソッドでデコードするという、いわゆる無音カメラの作り方ですね。無音にするのが目的ではないので、シャッター音は付けていますが。
 
 で、改めてASUS ME176 シリーズ タブレットPC ホワイト ( Android 4.4.2 / 7 inch / Atom Z3745 / 1GB / eMMC 16G / WIFI対応 ) ME176-WH16で起動してみたところ、decodeYUV420SP() で ArrayIndexOutOfBoundsException でごわす。
 
 「秘密のスライドパズル」は、480×800 の画面サイズを固定表示しているので、カメラのプレビューサイズも 480×800 に一番近い解像度を選択しているのですが、Android のカメラは横起動なので 800×480 サイズで近いカメラは見つけなければならない。これを誤っていた。否、やっていなかった。
 コード直してテストしたら、上手く動いている模様。
 
 ここで少し欲が出た。
 フロントカメラも使えるようにしたい・・。今までフロントカメラがある機種ありませんでしたからね。
 
 早速、作業に入ったところエラー連発。
 カメラの切り替え時に動いているカメラをリリースしてから改めてフロント(バック)カメラをセットしたのですが、setPreviewCallback() や setPreviewDisplay() を無視したので、リリース後にコールバックがかかりエラー。たぶん、そんなところ。
 直して、取得できるようになっても、今度はフロントカメラから取得した画像が上下逆さまになってしまう。取得元に応じて回転させて対応しました。
 ふ~。
 
 せっかく直したので「秘密のスライドパズル」をアップデートしました。

AndEngineで写真を分割する

 アプリ作成に気合が入りません。(これ、今朝も書いたね。)
 気持ちを奮い立たせるためにも、ブログに AndEngine の Tip のようなことを書きましょう。
 
 公開から既に2ヶ月近く経とうとしているのに、有効インストール数が5件とパッとしないことこの上ないアプリ「秘密のスライドパズル」なのですが、プログラム的には相当頑張った内容となっています。
 
 このアプリでは、写真を分割してスライドパズルをリアルタイムで作っています。「写真を分割する」なんてスゴいプログラムのような気がしません?
 AndEngine でのこの処理をご紹介します。「写真」ではなく「イラスト」でもよいですし、「分割」ではなく「切り出し」でも同じことです。
device-2014-07-14-005356
 写真を分割して並べ替えるとこうなります。
 
 まず、事前に画像を読み込んだ ITextureRegion picture_region を切り出すメソッドを作ります。読み込み部分は割愛。

public ITextureRegion loadPicture(float x, float y, float width, float height){
	picture_region.set(x, y, width, height);
	return picture_region;
}

 えっ、これだけ?
 これだけです。
 
 画面に Sprite を貼る時に位置と幅高さを指定します。こんな感じ。

	// それぞれの変数は名前から推し量ってください。
	for(int i = 0 ; i < panelCountX ; i++){
		for(int j = 0 ; j < panelCountY ; j++){
			x = offsetX + (panelSize*i);
			y = offsetY + (panelSize*(panelCountY-j-1));
			picture = new Sprite(x, y, loadPicture(offsetX + (i*panelSize), offsetY + (j*panelSize), panelSize, panelSize), vbom);
			// あとでのパネル毎の処理のためにタグを付けておく。
			picture.setTag((i*panelCountY) + j);
			// 中心座標で配置するとズレる場合があるので (0, 0) 座標を基準とする。
			picture.setOffsetCenter(0, 0);
			this.attachChild(picture);
		}
	}

 あまり使い道ないか・・。

アンドロイダーで「秘密のスライドパズル」のレビューが掲載されました

 「秘密のスライドパズル」がアンドロイダーの公認アプリとなり、レビューが掲載されました。
 
 ということは、このアプリ Android 2.3 以上でも動くのか?
 アンドロイダーさんは、本当に試したのか?
 Android 4.x でも動くのか?
 動くのか?
 
 動くのか?
 
 
 タイトルのスタイルを「子持ち主婦でもできる!無料で簡単Androidアプリ開発」さんの真似をしてしまいました。ごめんなさい。

「秘密のスライドパズル」公開

 Android アプリゲーム界隈でも激戦区であるスライドパズルゲームにまたもや参戦しました。誰でも作れるからね。
device-2014-07-14-005255 device-2014-07-14-005333 device-2014-07-14-005356
今回のアプリの主な機能は
 
・ アプリで撮った写真をスライドパズル化
・ 保存してある写真もスライドパズル化
・ スライドパズルは、3×5、4×6、5×8ピースの3パターン
・ 加えて、パズルとしては解けそうにもない11×19(Lモード)、20×34(Mモード)、32×57(Hモード)の「秘密のスライドパズル」
・ パズルを解くのが難しい場合には、ピース上に数字を表示
・ それでも解けない場合には、自動で手順を再現し解答
・ 「秘密のスライドパズル」は、瞬時に再現することも可
・ 解答手順は、パズル化した画像に記録されているので、画像を配布するだけでアプリで再現
・ パスコード(数字6桁)の設定
・ Gメールと連携したメール送信(ツイッター連携諦めて、こちらに鞍替え)
・ 480×800ピクセルのオートフォーカスカメラ
・ シャッターボタンの自由な位置設定
・ 端末のメディア音量によって調整できるシャッター音
 
と、スライドパズルにしては高機能です。
140714023232 140714023311 140714125601
 順に5×8、11×19、32×57で、この画像をアプリで読み込めばスライドパズルとなるわけです。我ながら地味に凄い。(32×57はパスコード「111111」が設定されています。)
 
 しかし、これらが機能するかは Android 2.3.3 の1機種 480×800 でしか確かめていないのですね。私が使っている機種です。未だ 2.3.3 です。現役です。
 
 昨今の高解像度のディスプレイやカメラの違いは吸収できるように組んだはずなのですが・・・確かめようがない。
 
 また、SDカードのパスを取得するため Environment.getExternalStorageDirectory() を使っているのですが、Android 4.4 ではそもそも外部SDカードは自由に使えないようで内部のパスを返すそうです。そんなんで動くの?
 さらにその場合、メール添付の画像パスは外部SDカードのパスでないと動かないとの記事もあり、この部分も気にかかるところです。
 
 そんな訳で不具合の報告を大々的に募集中です。
ic_launcher-web ssp_QRcode  
 よろしくお願いします。