2011年3月22日火曜日

Android カメラで写真を保存してみる

団長は言った。「AndroidはAndroidらしく、Androidじみたことしないといけないの!」と。WebアプリじゃなくてせっかくAndroidアプリの勉強してるんだから、もっと位置情報だったり、センサーだったり、カメラだったりを使えってことらしい。ま、言ったのは団長じゃないけれど。また、位置情報とか使わないとAndroidアプリじみてないのかと言われればそんなこともないのだろうけれど。言ってみたかっただけだろう。

しゃーなしだな!作った小遣い帳アプリに写真を登録できるようにしてみるか。

まずは勉強から。ここら辺がカメラに関した記事。
@IT もはやケータイに必須のカメラをAndroidで制御しよう
普通の写真撮影から、フラッシュ、エフェクト、オーバーレイなどの利用まで。
ITpro あなたのAndroidアプリを“カメラアプリ化”する
自分のアプリにボタン追加してカメラ起動させて撮った写真を背景にするように改造する。
@ITのソースをダウンロードしてGalaxy Sで動かして試していたのだが、しばらくしたらアプリが強制終了した。その後も起動してもすぐ終了。さらに驚いたのが、普通にカメラも使えなくなっている!!再起動でなおったけれど、結構焦った。。。
この疑似コードは、エラー処理やプレビューの再表示などが考慮されていません。
だからか?ちょっと追いかけるのも大変なので、ITproの記事を見てみる。こちらの記事もソースはダウンロード形式でソースの細かい説明はないので、まずはダウンロードして動かしてみる。これは特に問題なさそう。よし組み込んでみよう。

ソースを見てみると組み込みは割とそのままでイケそう。小遣い帳の登録内容と写真を紐付けないといけないので、IntentにputExtraで画像IDを渡して、その画像IDをファイル名にするという変更くらい。カメラどうのより、sqliteのカラム追加のが大変だったな。。あと、カメラ部分じゃないとこでの細かいエラー処理というか分岐というか。カメラに関してはほとんどそのままなのでコードの記載はしない。

で、色々大変ではあったがカメラに関係ない部分ので、割愛して組み込み完了、登録はできた!ただ、3,4枚登録すると、閲覧ページでリスト表示するとOutOfMemoryで落ちてしまう。うまい回避策はと調べていたが、見つからない。仕方ないので、写真保存時にThumbnailUtilsを使って、List表示用の小さいサイズのサムネイルも保存した。とりあえずは、OutOfMemoryもおさまった。でも、これはMemory制御てOutしないように処理をいれたわけではなくいので、たくさん写真撮ったらOutOfMemoryにもなるだろう^^;

そのあとも色々と大変だった。写真がボケるので長押しだとオートフォーカスにと思って実装したのだが、takePictureとautofocusが同時に動いて強制終了してしまったりとか。これもカメラがって話よりは、己れの技術が足りないためかもしれない。まぁ、そんなこんなで一応小遣い帳アプリに写真登録機能は追加できました。ってことにしておく。

まぁ写真では見にくくてわかりにくいけど、写真保存機能を追加した小遣い帳アプリはこんな感じ。

とりあえず、カメラ機能は難しい。何度強制終了を繰り返したことか。。
android.hardwareは一通りしっかり見といた方が良さそうだ。