ユーザーID パスワード

技術情報

  • FAQ よくある質問
  • 個人ユーザー向けサービスのお手続きについて

コード&コラム

第5回
カメラを使ってみよう(前編)


前へ 1 |2 |3 |4

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」と設定します。

//タッチ時に呼び出されるメソッド
public boolean onTouchEvent(MotionEvent event){
    //1本の指でタッチされたときに実行
    if(event.getAction()==MotionEvent.ACTION_DOWN){
        //スクリーンショットを取得する
        camera.takePicture(null, null, this);
    }
    //それ以外の時はtrueを返して処理をすすめる
    return true;

}

img

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時にスクリーンショットの値が渡される
public void onPictureTaken(byte[] data, Camera camera){
    Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length, null);
    MediaStore.Images.Media.insertImage(getContext().getContentResolver(), bmp, “”,null);
    camera.startPreview();

}

以上で撮影、保存の作業は終了です!

さて、いよいよ実行です!
[実行(R)]→[実行(R)]にて実行してみましょう。画面にカメラの先のプレビューが表示されればプレビューまでは成功です。画面をタッチするとシャッター音とともにプレビュー画面がストップされ裏で保存作業が行われます。再びカメラが起動されてプレビュー画面が動くようになれば保存作業も完了した事になります。


img

img

ギャラリーから撮影した画像を確認


上図のようにAndroid™ 本体のギャラリーから画像が確認出来れば今回のアプリの制作はすべて完了ということになります!

次回はこのカメラアプリをベースに、オートフォーカスの実装や動画の撮影、マイクによる音声の録音を行います。お疲れさまでした!


今回コラムで使用したプログラムはこちらからダウンロード出来ます。


第5回 カメラを使ってみよう(前編)
 Step1 プロジェクトの作成とフルスクリーンの設定
 Step2 カメラ機能の実装
 Step3 タッチで撮影、保存してみよう

(文責:株式会社ベストクリエイト)

■免責事項

本コラム内で提供する情報のご利用は、利用者ご自身の責任において行われるものとします。本コラムで提供される各種情報については、慎重に作成、管理をしておりますが、当社は、これらの情報の正確性、有用性、完全性等を保証するものではありません。当社は、利用者がこれらの情報をご利用になったこと、またはご利用になれなかったことにより生じたいかなる損害についても責任を負いません。
本コラムで提供される各種情報に関し、利用者と他の利用者あるいは第三者と紛争が生じた場合、利用者は自己の費用と責任においてこれを解決するものとし、当社に損害を与えないものとします。
当社は、本コラムに掲載する情報の全部又は一部を予告なく変更する場合がございます。また、本コラムの運用を休止または停止する場合がございます。
当社は、理由の如何を問わず本コラムの提供が遅延し、または中断したことに起因して利用者または第三者が被った被害について、一切の責任を負いません。
当社は、利用者が、本コラムで提供している情報からリンクが張られている第三者のウェブサイト、または本サイトへリンクを張っている第三者のウェブサイトから取得された各種情報のご利用によって生じたいかなる損害についても責任を負いません。
通信環境、利用者のコンピューター環境その他の理由により、本コラムが正常にご利用できない場合がございます。
当社は、本コラムから入手された文書・写真・イラスト・動画・リンクその他各種情報(以下総称して「情報」といいます)に関して技術的サポート、機能改善等のいかなる技術的役務の提供もいたしかねますので、あらかじめご了承ください。
本掲載内容・各種名称は公開日時点のものであり、団体・サービス・ツール等の名称が変更されることがあります。

サンプルコード

第1回 リファレンスコード(文字列編)

第2回 リファレンスコード2(グラフィックス編)

第3回 リファレンスコード3(タッチイベント編)

第4回 リファレンスコード4(チェックボックス/ラジオグループ編)

第5回 リファレンスコード5(スピナー編)

第6回 リファレンスコード6(サウンド/ムービー編)

第7回 リファレンスコード7(トースト編)

第8回 リファレンスコード8(Google Maps API利用編)

第9回 リファレンスコード9(SQLite編)

第10回 リファレンスコード10(音声認識編)

第11回 リファレンスコード11(日付/時刻ダイアログ編)

第12回 リファレンスコード12(Bluetooth編)