back

ハードウェア・アクセス (6/7)

■画面をタップして撮影する

では、これを改良して、画面をタップしたら、その時の画像をJPEGファイルで保存するようにしてみましょう。下のリストが修正版になります。

ここでは、「onTouchEvent」というメソッドが新たに追加されています。こういうものですね。
public boolean onTouchEvent(MotionEvent event) {……}
これは、画面に触れたときに発生するイベント処理用のメソッドです。ここに、画面をキャプチャーする処理を用意しておけばいいわけですね。

画面のキャプチャーは、Cameraの「takePicture」メソッドで行うことができます。これは、以下のような形になっています。
[Camera].takePicture( 撮影時 , row生成時 , jpeg生成時 );
引数は3つあり、撮影をした直後、撮影した画像をrowデータとして生成した時、JPEGデータとして生成したときにそれぞれ呼び出されるコールバックを設定します。このコールバックは、撮影時がCamera.ShutterCallback、他の2つがCamera.PictureCallbackのインスタンスとして用意されます。ここでは、JPEG生成時のコールバックを以下のように用意しています。
PictureCallback jpeg = new PictureCallback() {
    @Override
    public void onPictureTaken(byte[] bytes, Camera camera) {
        ……データの保存処理……
    }
}
このPictureCallbackインスタンスは、その中にonPictureTakenメソッドを持ちます。このメソッドに、実際にコールバックとして呼び出される処理を用意すればよい、というわけです。

※AndroidManifest.xmlのパーミッション設定

今回のサンプルでは、データをSDカードに書き出すようにしています。これを行う場合、Android SDK 1.6以降では、AndroidManifest.xmlに<uses-permission>を追加し、外部ストレージへのアクセスを許可する必要があります。<manifest>内に以下のように追加してください。
<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


(by. SYODA-Tuyano.)

※リストが表示されない場合

AddBlockなどの広告ブロックツールがONになっているとリストなどが表示されない場合があります。これらのツールをOFFにしてみてください。

※AndroidManifest.xmlの追加
<uses-permission
	android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

※SampleApp.javaの修正
package jp.tuyano;

import java.io.*;

import android.app.*;
import android.content.Context;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.util.Log;
import android.view.*;
import android.widget.Toast;

public class SampleApp extends Activity {
	private Preview mPreview;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		mPreview = new Preview(this);
		setContentView(mPreview);
	}

}

class Preview extends SurfaceView implements SurfaceHolder.Callback {
	SurfaceHolder mHolder;
	Camera mCamera;

	Preview(Context context) {
		super(context);
		mHolder = getHolder();
		mHolder.addCallback(this);
		mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
	}

	public void surfaceCreated(SurfaceHolder holder) {
		mCamera = Camera.open();
		try {
			mCamera.setPreviewDisplay(holder);
		} catch (IOException exception) {
			mCamera.release();
			mCamera = null;
		}
	}

	public void surfaceDestroyed(SurfaceHolder holder) {
		mCamera.stopPreview();
		mCamera.release();
		mCamera = null;
	}

	public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
		Camera.Parameters parameters = mCamera.getParameters();
		parameters.setPreviewSize(w, h);
		mCamera.setParameters(parameters);
		mCamera.startPreview();
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		if (event.getAction() == MotionEvent.ACTION_DOWN) {
			PictureCallback jpeg = new PictureCallback() {
				@Override
				public void onPictureTaken(byte[] bytes, Camera camera) {
					FileOutputStream stream = null;
					BufferedOutputStream buffer = null;
					try {
						stream = new FileOutputStream("/sdcard/capimg.jpg");
						buffer = new BufferedOutputStream(stream);
						buffer.write(bytes);
					} catch (FileNotFoundException e) {
						e.printStackTrace();
					} catch (IOException e) {
						e.printStackTrace();
					} finally {
						try {
							buffer.close();
						} catch (Exception e) {
							e.printStackTrace();
						}
					}
				}
			};
			mCamera.takePicture(null,null,jpeg);
			mCamera.startPreview();
		}
		return true;
	}
}



   

記事のリストに戻る



PC Site G+ mail