カメラアプリで撮影

カメラアプリで撮影

まずは構文のメモ

void takePicture(Camera,ShuterCallback shutter,
Camera.PictureCallback raw,
camera.PictureCallback jpeg)
カメラの撮影をする

void takePicture(
Camera.ShutterCallback shutter,
Camera.PictureCallback raw,
Camera.PictureCallback postpreview,
Camera.PictureCallback jpeg)
カメラの撮影を行う

void onShutter()
シャッターが押されたときに呼び出すコールバック

void onPictureTaken(byte[] data,
Camera camera )
JPEGイメージ生成後に呼び出されるコールバック

それぞれの引数の意味は
shutter
シャッターが押されたときによばれるコールバックを受け取る
camera.ShutterCallbackインスタンス

raw
Rawイメージ生成時に呼ばれるコールバックを受け取る
Camera.PictureCallbackインスタンス

postview
postview のイメージデータ生成時に呼ばれるコールバックを欝ケトル
Camera.Picturecallback インスタンス

jpeg
JPEG イメージ生成自に呼ばれるコールバックを受け取る
Camera.PictureCallback インスタンス

takePicture()を呼び出すと
SurfaceView へのプレビュー表示がストップする

なので
引き続きプレビュー画面を表示するには
写真撮影処理の終わりで
startPreview() を呼び出すこと

プレビュー画面の表示には
SurfaceView を使う

これは
onCreate() で
SurfaceView を作成し
カメラのプレビュー画面を用意する

次に SurfaceView の SurfaceHolder を生成して
callback メソッドを実装する

実装した SurfaceHolder のcallbackメソッドでは
surfaceCreated() の中で
カメラを open()
プレビューディスプレイをセットする

surfaceChanged() では
カメラのパラメータでプレビューサイズをセットする

surfaceDestroyed() で
カメラプレビュー停止とリリースをしてカメラを開放する

surfaceview は
メインスレッドとは別のスレッドを描画専用で割り当てるので頻繁に画面を表示するときに使う

次に写真撮影関連

撮影するには
onCreate() の中で撮影ボタンを設置して
リスナーを登録する

次に
撮影ボタンのリスナー OnClickListener へ
takePicture() と
撮影した画像をSDカードに保存する処理 saveSD を記述する

tkePicture() では
shutter
raw
jpeg
の3つのコールバックを設定する

画像の保存はSDカードなどの外部ストレージ
ファイル名は現在時刻を使ったものにする

すでにプレビュー画面表示のアプリを作成しているのでこれを改造する

まずはシャッターが押されたときのコールバックK実装

public void surfaceDestroyed(){

}

の下へ実装する

		//シャッターが押されたときの処理
		private Camera.ShutterCallback mShutterListener = new Camera.ShutterCallback() {
			
			@Override
			public void onShutter() {
				// TODO Auto-generated method stub
				
			}
		};

を追加

そしてJPEGイメージ生成後に呼び出す処理
つまり写真をとったときの処理

//JPEG イメージ生成語の処理
		private Camera.PictureCallback mPictureListener = new Camera.PictureCallback() {
			
			@Override
			public void onPictureTaken(byte[] data, Camera camera) {
				// TODO Auto-generated method stub
				//sd card jpeg データを保存
				if(data != null){
					FileOutputStream myFOS=null;
					try {
						myFOS = new FileOutputStream("/sdcard/camera_test.jpeg");
						myFOS.write(data);
						myFOS.close();
					} catch (Exception e) {
						// TODO: handle exception
						e.printStackTrace();
					}
					//preview start
					camera.startPreview();
				}
			}
		};

となる

そして最後に写真をとる処理
これは
onTouchEvent() で実装


		@Override
		public boolean onTouchEvent(MotionEvent event) {
			// TODO Auto-generated method stub
			//camera preview end
			if(event.getAction() == MotionEvent.ACTION_DOWN){
				if(mCamera !=null){
					//写真撮影
					mCamera.takePicture(mShutterListener, null, mPictureListener);
					return true;
				}
			}
			return super.onTouchEvent(event);
		}

あと、外部ストレージ保存するので

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

が必要になる

とりあえずできたけど
nexus7 外部ストレージがなかった
あと、カメラの向きおかしいので修正の必要があるので
今後修正

次はオートフォーカスにチャレンジ予定

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です