ハードウェア・アクセス (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() {このPictureCallbackインスタンスは、その中にonPictureTakenメソッドを持ちます。このメソッドに、実際にコールバックとして呼び出される処理を用意すればよい、というわけです。
@Override
public void onPictureTaken(byte[] bytes, Camera camera) {
……データの保存処理……
}
}
※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; } }
※関連コンテンツ