2015-10-24

Android Studio でカメラアプリの作成

愛犬がお昼寝しているとついつい写真を撮りたくなってしまいます。

しかしシャッター音が鳴るので、お昼寝の邪魔をしてしまいます。

そこで、シャッター音が鳴らないシンプルなカメラアプリを作ってみようと思います。

アプリにカメラの使用を許可する


AndroidManifest.xml を編集し、アプリにカメラの使用を許可するパーミッションを追加します。
  • AndroidManifest.xml に以下を追加
<uses-permission android:name="android.permission.CAMERA" />

アプリを横画面固定にする


カメラ画像のプレビュー画面を横画面固定にしておきます。
  • AndroidManifest.xml の <activity> タグに以下を追加
android:screenOrientation="landscape"

カメラが取得した画像を画面に表示する


カメラが取得した画像を画面に表示するコードを作成します。
  • MainActivity.java を以下の通り書き換え
package com.example.camera;

import android.app.Activity;
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.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.FrameLayout.LayoutParams;

import java.util.List;

public class MainActivity extends Activity {

    SurfaceView sv;
    SurfaceHolder sh;
    Camera cam;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        FrameLayout fl = new FrameLayout(this);
        setContentView(fl);

        sv = new SurfaceView(this);
        sh = sv.getHolder();
        sh.addCallback(new SurfaceHolderCallback());

        fl.addView(sv);
    }

    class SurfaceHolderCallback implements SurfaceHolder.Callback {
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            cam = Camera.open();
            Parameters param = cam.getParameters();
            List<Size> ss = param.getSupportedPictureSizes();
            Size pictSize = ss.get(0);

            param.setPictureSize(pictSize.width, pictSize.height);
            cam.setParameters(param);
        }
        @Override
        public void surfaceChanged(SurfaceHolder holder, int f, int w, int h) {
            try {
                cam.setDisplayOrientation(0);
                cam.setPreviewDisplay(sv.getHolder());

                Parameters param = cam.getParameters();
                List<Size> previewSizes =
                        cam.getParameters().getSupportedPreviewSizes();
                Size pre = previewSizes.get(0);
                param.setPreviewSize(pre.width, pre.height);

                LayoutParams lp = new LayoutParams(pre.width, pre.height);
                sv.setLayoutParams(lp);

                cam.setParameters(param);
                cam.startPreview();
            } catch (Exception e) { }
        }
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            cam.stopPreview();
            cam.release();
        }
    }
}

以上で、スマートフォンに搭載されているカメラを使って取得した画像を画面に表示できるようになりました。次は、撮影ボタンを設置して写真が撮影できるようにします。

これ以降の記事

3 件のコメント:

  1. Android Studio 初心者2016/07/12 12:45

    こんちには。素敵な記事をありがとうございます。
    Android Studio 2.1.2で実行したところ

    Error:java.lang.UnsupportedClassVersionError: com/android/dx/command/Main : Unsupported major.minor version 52.0

    とエラーが出ました。
    解決方法がわかれば教えていただきたいです。

    返信削除
    返信
    1. Android Studio 初心者2016/07/12 17:48

      SDKのバージョンを19にしたらできました。お騒がせしました。

      削除
  2. 大変参考になる記事ありがとうございます。
    現在バージョン24を使用しているのですが、バージョンを変更することなく実装するにはどのようにコードを直せばよいのでしょうか?お手数かとは思いますがご教授いただけないでしょうか。よろしくお願いいたします。

    返信削除