今回はカメラの使用方法の後編になります。
前回はカメラをオープンして、SurfaceViewにカメラのプレビュー画面を表示するところまで紹介しました。
今回はプレビュー画面の内容を撮影し、SDカードに保存するという処理まで説明したいと思います。
詳細は続きからどうぞ。
撮影処理を司るのはCameraクラスのtakePictureです。public final void takePicture (Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback jpeg)
引数はそれぞれ以下のようになっています。
- Camera.ShutterCallback shutter:シャッターが押されたときに呼ばれるコールバックを指定します。
- Camera.PictureCallback raw:Rawイメージ生成後に呼ばれるコールバックを指定します。
- Camera.PictureCallback jpeg:JPEGイメージ生成後に呼ばれるコールバックを指定します。
ボタンを押したときなどのタイミングでtakePictureメソッドを呼び出してやれば上記の各コールバックが呼ばれることになります。
たとえば、画面を押したときに撮影を行い、SDカードにデータを保存する、というコードを書くと以下のようになります。
// シャッターが押されたときに呼ばれるコールバック private Camera.ShutterCallback mShutterListener = new Camera.ShutterCallback() { public void onShutter() { // TODO Auto-generated method stub } }; // JPEGイメージ生成後に呼ばれるコールバック private Camera.PictureCallback mPictureListener = new Camera.PictureCallback() { public void onPictureTaken(byte[] data, Camera camera) { // SDカードにJPEGデータを保存する if (data != null) { FileOutputStream myFOS = null; try { myFOS = new FileOutputStream("/sdcard/camera_test.jpg"); myFOS.write(data); myFOS.close(); } catch (Exception e) { e.printStackTrace(); } camera.startPreview(); } } }; @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { if (myCamera != null) { myCamera.takePicture(mShutterListener, null, mPictureListener); } } return true; }
なお、takePictureメソッドを呼び出すとSurfaceViewへのプレビュー表示がストップしてしまいますので注意が必要です。
上記コードのJPEGイメージ生成後に呼ばれるコールバック処理内の最後でプレビューを再開しているのはそのためです。