Master -
Yucchi
Since - 2012/05/05
NetBeans で Android 実機デバッグをやってみた
NetBeans の Android プログラミング用プラグインの NBANDROID でカメラを使ったアプリをほとんど古い雑誌から丸写しで作ってみた。
そのプログラムは WEB+DB PRESS という雑誌に載っていたものです。(Java PRESS とかって雑誌も昔はあったなぁ・・・)
Android SDK 開発のレシピ という Tip 本の著者である塚田 翔也さんが作られたものです。
雑誌には限られた誌面のなかで丁寧に解説がされていました。
しかし、私の使ってる XPERIA arc では動きませんでした。
それに twitter の認証が Basic は駄目になってるのようなのでその部分の機能は削除し
適当に画像をオーバーレイさせてみることにしました。
この前は NetBeans で実機のデバッグをすることができないとあきらめたのですが
今日はちょっと時間がとれたので試してみました。
以下にとりあえず実機でデバッグする方法を私的メモとして残しておきます。
もっとちゃんとした方法があると思うのですが NetBeans での実機デバッグの日本語での情報を見つけることができなかった。゜(゜´Д`゜)゜。
はじめにサービスウィンドウに Android Devices のノードに PC に USB デバッグモードで接続された端末があることを確認します。
AndroidManifest.xml ファイルに android:debuggable="true" と追記します。(必要かどうか検証してません)
プロジェクトウィンドウで プロジェクトを右クリック、そして [ デバッグ ] をクリックします。
デバイスの選択ウィンドウが出ますので
PC に接続されている実機を選択します。
Debug のチェックボックスにチェックを入れようとしてもいれられませんので無視します。
私は念のため、はいらないけどいちおうチェックをいれました(..;)
了解ボタンをクリックして進みます。
すると実機の画面にこんなメッセージが表示されます。
ここで [ Force Close ] ボタンを押したいところですがこのままにします。
サービスウィンドウの Android Devices ノードにある実機のノードに <unknown> pid: 18031 が生成されてます。
それを右クリック、 [ Debug this process ] をクリックします。
デバッグ実行が開始されます。
今回のプログラムではカメラ制御のところにウォッチポイントとブレークポイントを設定してあります。
ちゃんとデバッグできてますね。
NetBeans の慣れた環境で落ち着きます。
っていうか Android の開発なら eclipse のほうが強力なのは言うまでもないでしょうが NetBeans のほうが好き(#^.^#)
ちなみに XPERIA arc のカメラがサポートしている解像度もこれでバッチシですね。
最後にとりあえず動くようにできたので最近お気に入りの黒木 メイサちゃんを撮ってみました。
ちょっとスクリーンショットが切れてますがこんな感じにカメラを使い顔認識させ画像を合成させることができました(≧▽≦)
ちなみにスクリーンショットを撮るには サービスウィンドウの Android Devices ノードにある実機を右クリック
そして [ Take Device Screenshot.. ] をクリックするだけです。
まだリアルタイム顔認識の部分がちょっとおかしいのですが NetBeans のデバッガが使えないと思いこんでいて先日力技で修正してしまいました( ̄。 ̄;)
あとは合成用の画像をいくつか作って遊んでみることにします。
最後にこのプログラムの元を作り、雑誌に解説記事まで執筆してくれてこんな楽しいことが Android ならできることを教えてくれた
塚田 翔也さんに感謝いたします\(^_^)/
おまけ カメラを使うアプリの落とし穴をメモ
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // カメラのプレビューのサイズを設定 if (mCamera != null) { mCamera.stopPreview(); setPreviewSize(width, height); // カメラのプレビューを開始 mCamera.setPreviewCallback(previewCallback); mCamera.startPreview(); } } private void setPreviewSize(int width, int height) { Camera.Parameters params = mCamera.getParameters(); Listsupported = params.getSupportedPreviewSizes(); if (supported != null) { for (Camera.Size size : supported) { if (size.width <= width && size.height <= height) { params.setPreviewSize(size.width, size.height); X_RATIO = (float) width / (float) size.width; Y_RATIO = (float) height / (float) size.height; mCamera.setParameters(params); break; } } } } 一つ目の落とし穴
プレビューサイズはそのデバイスがサポートしているものをセットする。
上記コードでは setPreviewSize(width, height); でサポートしている解像度の一番大きいのを選んでます。
二つ目の落とし穴
デバイスに表示されるプレビューはカメラがサポートしている解像度と一緒ではない。(表現が変ですみません)
私の XPERIA arc では 640 X 480 のプレビュー画像を 854 X 480 に引き延ばして表示されてしまいました。
そのため顔認識で得た face.getMidPoint(point); の両目の中心位置情報とデバイスに表示される実際の位置がずれてしまいました。
合成用の画像を最後に追加したときの座標は 640 X 480 のまま引き延ばされないで表示されていました。(右側 214 余り(×_×)
融通が利かないというか・・・なんていうか・・・
しかたないので合成用の画像の座標位置に補正をかけることで対処しました。
以上、素人が落とし穴に落ちた状況をφ(..)メモメモ
対処方法とか、そもそも作り方が根本的に間違ってるかもしれませんが Android ってバージョンアップのスピードは速いし
次から次へと新しい機種が追加されるから落とし穴がけっこうあるかもしれないですね。