
カメラに写った映像をプレビュー表示するサンプル#tryCamera00


とにかく端末についたカメラを使って画像を取り込みたい。
カメラに写った画像をそのまま画面に表示する。
プレビューとして表示できる画像サイズがきまっているため、そのサイズに合わせたレイアウトにしないと画像データがいっぱいに伸ばされるらしくて狂った画像が表示されてしまう。
プレビューサイズとレイアウトのサイズをうまく合わせないといけない。
AndroidManifest.xmlに
<uses-permission android:name="android.permission.CAMERA"/> <user-feature android:name="android.hardware.camera"/>
を追加しないとカメラが使えない
●関連項目
SurfaceHolder.Callback
Camera
getSupportedPreviewSizes
setPreviewSize
●開発環境
Eclipse IDE バージョン: 3.7 Indigo Service Release 2
ターゲットプラットフォーム: 2.1
API レベル: 7
確認端末: SC-04D GALAXY NEXUS(Android 4.0.2)
package trial.sample.trycamera00; import java.io.IOException; import java.util.List; import android.app.Activity; import android.content.Context; import android.hardware.Camera; import android.hardware.Camera.Parameters; import android.hardware.Camera.Size; import android.os.Bundle; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; public class TryCamera00Activity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // タイトルなし this.requestWindowFeature(Window.FEATURE_NO_TITLE); // カメラのプレビューを全画面で設定する this.setContentView(new CameraView(this)); } } // //////////////////////////////////////////////////////////// // カメラ用SurfaceView class CameraView extends SurfaceView implements SurfaceHolder.Callback { private Camera mCamera; // カメラ本体 // //////////////////////////////////////////////////////////// // コンストラクタ public CameraView(Context context) { super(context); // TODO 自動生成されたコンストラクター・スタブ SurfaceHolder holder = this.getHolder(); // これしないと落ちるんだってさ。でもAndroid4.0.2だと落ちないんだけど holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // コールバックとして登録する holder.addCallback(this); } // //////////////////////////////////////////////////////////// // サーフェイスが作られたときに呼ばれる public void surfaceCreated(SurfaceHolder holder) { // カメラを開く this.mCamera = Camera.open(); // カメラが正常に開かれた if (this.mCamera != null) { // プレビューを設定するSurfaceHolderを設定 try { this.mCamera.setPreviewDisplay(holder); } catch (IOException e) { e.printStackTrace(); } } } // //////////////////////////////////////////////////////////// // サーフェイスサイズが変更されたときとかに呼ばれる public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // プレビューを止める this.mCamera.stopPreview(); // カメラの情報を取り出す Parameters params = this.mCamera.getParameters(); int tmpWidth = 0; int prevWidth = width; int prevHeight = height; // カメラがサポートしているプレビューイメージのサイズ List<Size> sizeList = params.getSupportedPreviewSizes(); // カメラに設定されているサポートされているサイズを一通りチェックする for (Size currSize : sizeList) { // プレビューするサーフェイスサイズより大きいものは無視する if ((prevWidth < currSize.width) || (prevHeight < currSize.height)) { continue; } // プレビューサイズの中で一番大きいものを選ぶ if (tmpWidth < currSize.width) { tmpWidth = currSize.width; prevWidth = currSize.width; prevHeight = currSize.height; } } // プレビューサイズをカメラのパラメータにセットする params.setPreviewSize(prevWidth, prevHeight); // 実際のプレビュー画面への拡大率を設定する float wScale = width / prevWidth; float hScale = height / prevHeight; // 画面内に収まらないといけないから拡大率は幅と高さで小さい方を採用する float prevScale = wScale < hScale ? wScale : hScale; // SurfaceViewのサイズをセットする ViewGroup.LayoutParams layoutParams = this.getLayoutParams(); layoutParams.width = (int)(prevWidth * prevScale); layoutParams.height = (int)(prevHeight * prevScale); // レイアウトのサイズを設定し直して画像サイズに一致するようにする // 一致させないと変な感じに画像がのびちゃう this.setLayoutParams(layoutParams); // カメラにプレビューの設定情報を戻してプレビューを再開する this.mCamera.setParameters(params); this.mCamera.startPreview(); } // //////////////////////////////////////////////////////////// // サーフェイスが破棄される問いに呼ばれる public void surfaceDestroyed(SurfaceHolder holder) { // カメラがある if (this.mCamera != null) { // プレビューの終了処理 this.mCamera.stopPreview(); this.mCamera.release(); this.mCamera = null; } } }
AndroidアプリでクリップボードにClipboardManagerを使ってテキストを書き... Androidのエミュレーターでlocalhostに接続したい!