ハードウェア・アクセス (6/7)
作成:2010-06-01 21:43
更新:2010-06-16 17:31
更新:2010-06-16 17:31
■画面をタップして撮影する
では、これを改良して、画面をタップしたら、その時の画像をJPEGファイルで保存するようにしてみましょう。下のリストが修正版になります。
ここでは、「onTouchEvent」というメソッドが新たに追加されています。こういうものですね。
画面のキャプチャーは、Cameraの「takePicture」メソッドで行うことができます。これは、以下のような形になっています。
※AndroidManifest.xmlのパーミッション設定
今回のサンプルでは、データをSDカードに書き出すようにしています。これを行う場合、Android SDK 1.6以降では、AndroidManifest.xmlに<uses-permission>を追加し、外部ストレージへのアクセスを許可する必要があります。<manifest>内に以下のように追加してください。
ここでは、「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;
}
}
※関連コンテンツ