- Android
- 2011-11-11 - 更新:2013-07-16
この記事は最終更新日から1年以上経過しています。
まずは簡単にカメラを使う方法から。
オートフォーカス等も使用できるので、また別途書きます。
カメラを使うときは、SurfaceViewクラスを使います。
初歩なので、Javaファイルは一つで実装可能なようにしています。
import java.io.IOException; import android.app.Activity; import android.os.Bundle; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Rect; import android.hardware.Camera; import android.hardware.Camera.PictureCallback; import android.hardware.Camera.ShutterCallback; import android.provider.MediaStore; import android.util.Log; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.Window; public class HelloCameraActivity 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); } @Override protected void onResume() { super.onResume(); } @Override protected void onPause() { super.onPause(); } } 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 (mCamera != null) { // イメージの取得を開始する。リスナーを設定する mCamera.takePicture(mShutterListener, // シャッター後 rawListener, // Rawイメージ生成後 jpegListener); // JPEイメージ生成後 } return super.onTouchEvent(event); } ShutterCallback mShutterListener = new ShutterCallback() { @Override public void onShutter() { Log.d("TEST", "onShutter"); } }; PictureCallback rawListener = new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { Log.d("TEST", "onPictureTaken: raw: data=" + data); } }; // PictureCallback jpegなどが生成された後に呼び出される private PictureCallback jpegListener= new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { // 保存する処理 //カメラのイメージ Bitmap cameraMap = BitmapFactory.decodeByteArray(data, 0, data.length, null); //空のイメージを作成 Bitmap offBitmap = Bitmap.createBitmap(cameraMap.getWidth(), cameraMap.getHeight(), Bitmap.Config.ARGB_8888); Canvas offScreen = new Canvas(offBitmap); offScreen.drawBitmap( cameraMap, null, new Rect(0, 0, cameraMap.getWidth(), cameraMap.getHeight()), null); // 保存 "sample"はファイル名 MediaStore.Images.Media.insertImage(getContext().getContentResolver(), offBitmap, "sample", null); mCamera.startPreview(); } }; }
AndroidManifest.xmlにカメラが使えるようにと、SDカードへのアクセスを許可するために
以下の記述を追加します。
<manifest>
タグ内に記述してください。
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> <uses-feature android:name="android.hardware.camera.flash" />
3,860 views