Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

カメラ制御のサンプルは掃いて捨てるほどあるが、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>
zaburo
こんにちは。自分用のメモをだらだら公開しています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away