カメラ制御のサンプルは掃いて捨てるほどあるが、1つのサンプルでいろいろなことをやりすぎているので、シンプルに1つずつ見てみます。
###他のステップはこちら
STEP1:基礎
STEP2:オートフォーカスとか
STEP3:保存
STEP4:アスペクト比調整
###はじめに
このサンプルを実行すると、Preview画面が90度ずれたりします。が、それらへの対応処理を入れると可読性が落ちるのでとりあえず無視。
###やりたいこと
とりあえずプレビュー表示する
###カメラ制御の主な流れ
・Manifestに<uses-permission android:name="android.permission.CAMERA"></uses-permission>を追加
・プレビュー表示用のSurfaceViewを配置(ないしはプログラムの中で生成)
・SurfaceViewを制御するためのSurfaceHolderを取得
・Callbackに3つのメソッドを実装(onCreate, onChanged, onDestroyed)
⇒onCreatedでCameraをOpen。
⇒onChangedでPreviewスタート。
⇒onDestroyedで破棄。
ポイントは、Changedが初回にも1度呼ばれること(画面が変化しなくても)。
###備考
フルスクリーンにしたり、アスペクト比を調整したりいろいろしなければならないが、流れをおさらいすること重視なので以上。
これを基本として、
・画面タッチで写真の撮影 + 保存
・AutoFocusの実装
・バーコードの読取り
などを行う。
###ソース
import android.app.Activity;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class MyActivity extends Activity {
private SurfaceView mySurfaceView;
private Camera myCamera; //hardware
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
//SurfaceView
mySurfaceView = (SurfaceView)findViewById(R.id.mySurfaceVIew);
//SurfaceHolder(SVの制御に使うInterface)
SurfaceHolder holder = mySurfaceView.getHolder();
//コールバックを設定
holder.addCallback(callback);
}
//コールバック
private SurfaceHolder.Callback callback = new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
//CameraOpen
myCamera = Camera.open();
//出力をSurfaceViewに設定
try{
myCamera.setPreviewDisplay(surfaceHolder);
}catch(Exception e){
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2, int i3) {
//プレビュースタート(Changedは最初にも1度は呼ばれる)
myCamera.startPreview();
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
//片付け
myCamera.release();
myCamera = null;
}
};
}
いちおうXMLも。
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<SurfaceView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/mySurfaceVIew" />
</FrameLayout>