Step3 タッチで撮影、保存してみよう
Step3ではタッチ時にプレビュー画面を撮影をするプログラムを書きこんでいきます。
タッチ時に呼ばれる処理は新しいメソッド「onTouchEvent」を利用します。
さらにif構文を利用して、タッチイベントの発生時にスクリーンショットを保存する命令を記述します。この時スクリーンショットを取得するための条件として「1本指でタッチされていること」を指定しています。その条件を記述した命令が以下の引数eventに始まる1行です。ACTION_DOWNの部分が「1本指でのタッチ」を指定している部分です。
(event.getAction()==MotionEvent.ACTION_DOWN) |
スクリーンショットを取得するためには以下の命令を用います。
Camera.takePicture(Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback jpeg) |
()内の引数には、それぞれ3つのメソッドを指定します。ShutterCallbackにはシャッター音などシャッター時に行う処理、PictureCallback rawにはraw画像を取得したときの、PictureCallback jpegにはJPEG画像を取得したときのメソッドを記述します。
利用しないメソッドにはnullと記述します。今回はJPEG画像を取得したいので、3番目の引数を設定します。この時引数に指定するのは、以降説明する「onPictureTaken」の場所です。同一クラス内に記述する予定なので「this」と設定します。
//タッチ時に呼び出されるメソッド |
3番目の引数に「this」と指定するとエラーになってしまいます。これは予めコールバックをCameraViewクラスに実装しなければいけなかったためで、以下の画像の項目をクリックしてPictureCallbackをimplemantsにて実装してください。
さて、スクリーンショット画像を取得するところまで作業は進みました!しかしこれだけではまだ完了していません。そうです、保存を行わなければなりませんね。
様々な画像の形式で扱うことを目的として、実はスクリーンショット取得の時点でこのデータはビットマップという形式のバイトデータになっています。Android™ でサポートされている画像フォーマットはBMP、JPG、PNG、GIFで、画像ファイルとして保存するためには、バイトデータをそれらのフォーマットのいずれかに変換しなければなりません。(ビットマップだからといってBMP形式とは限りません)その作業を行うのが、次に説明する「onPictureTaken」メソッド内の処理です。
まずonPictureTakenメソッドを追加します。引数にはバイトデータに付ける名前「data」とカメラ再開時のためのカメラオブジェクトの名前「camera」を設定しています。
さらにBitmapFactoryメソッドを利用してビットマップ状態のスクリーンショットのデータをデコードし、ひとつの画像ファイルとして形作っています。以下のような構成です。
BitmapFactory.decodeByteArray(byte[] data, int offset, int length, BitmapFactory.Options opts) |
第1引数にはonPictureTaken追加時に指定した「data」という名前を指定します。第2引数にはバイトコード内でデコードし始める位置を指定します。通常データの最初からデコードし始まるので「0」と指定します。第3引数には第2引数で指定した位置から何バイト目まで画像としてデコードするかを指定します。バイトコードの最後までデコードしてもらうため、「data」そのものを入力します。第4引数にはオプション項目を指定できます。
オプション項目ではデコード後の画像サイズやデコードし始めるX/Y座標を指定したりできますが、今回はそのような処理は必要ないので「null」と指定します。
続けて、MediaStore.Images.Media.insertImageメソッドを利用して画像の名前や保存するディレクトリ、説明の情報を付加することができます。
MediaStore.Images.Media.insertImage (ContentResolver cr, String imagePath, String name, String description) |
第1引数には
第2引数には画像ファイルのパスを記述します。今回は生成した時点で「bmp」と指定しているためそれを記述しています。第3、第4引数には画像に付加する名前と説明を記述します。名前の方は何も指定しないことでランダムに付加することができます。説明は今回は必要ないので空にしておきます。
最後に保存中止めたままだったプレビューを再び起動しましょう。
//camera.takePicture時にスクリーンショットの値が渡される |
以上で撮影、保存の作業は終了です!
さて、いよいよ実行です!
[実行(R)]→[実行(R)]にて実行してみましょう。画面にカメラの先のプレビューが表示されればプレビューまでは成功です。画面をタッチするとシャッター音とともにプレビュー画面がストップされ裏で保存作業が行われます。再びカメラが起動されてプレビュー画面が動くようになれば保存作業も完了した事になります。
ギャラリーから撮影した画像を確認
上図のようにAndroid™ 本体のギャラリーから画像が確認出来れば今回のアプリの制作はすべて完了ということになります!
次回はこのカメラアプリをベースに、オートフォーカスの実装や動画の撮影、マイクによる音声の録音を行います。お疲れさまでした!
今回コラムで使用したプログラムはこちらからダウンロード出来ます。
第5回 カメラを使ってみよう(前編)
Step1 プロジェクトの作成とフルスクリーンの設定
Step2 カメラ機能の実装
Step3 タッチで撮影、保存してみよう
(文責:株式会社ベストクリエイト)
■免責事項