カメラアプリで撮影
まずは構文のメモ
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 外部ストレージがなかった
あと、カメラの向きおかしいので修正の必要があるので
今後修正
次はオートフォーカスにチャレンジ予定