LoginSignup
54
53

More than 3 years have passed since last update.

今更カメラ制御の基礎(STEP1:とりあえずプレビュー表示)

Last updated at Posted at 2014-10-18

カメラ制御のサンプルは掃いて捨てるほどあるが、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の実装
・バーコードの読取り

などを行う。

ソース

MainActivity.java

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も。

activity_my.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>
54
53
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
54
53