2016-01-10

フロントカメラとバックカメラを切替える

スポンサーリンク

Android Studio を使ってフロントカメラとバックカメラを切替えるアプリを作成してみます。
以下の記事をベースに作成しました。

関連記事



フロントカメラとバックカメラを切替えるアプリの作成


  • MainActivity.java を以下の通り書き換え
  • package com.example.camera;
    
    import android.app.Activity;
    import android.graphics.PixelFormat;
    import android.hardware.Camera;
    import android.hardware.Camera.CameraInfo;
    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.View;
    import android.view.Window;
    import android.view.WindowManager;
    import android.widget.Button;
    import android.widget.FrameLayout;
    import android.widget.FrameLayout.LayoutParams;
    
    import java.util.List;
    
    public class MainActivity extends Activity {
    
        SurfaceView sv;
        SurfaceHolder sh;
        Camera cam;
        int backCameraId = -1;
        int frontCameraId = -1;
        int cameraId = -1;
    
        @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());
    
            Button btn = new Button(this);
            btn.setText("切替");
            btn.setLayoutParams(new LayoutParams(200, 150));
            btn.setOnClickListener(new ChangeCameraClickListener());
    
            fl.addView(sv);
            fl.addView(btn);
        }
        class ChangeCameraClickListener implements View.OnClickListener {
            @Override
            public void onClick(View v) {
                cam.stopPreview();
                cam.release();
                if (cameraId == frontCameraId) {
                    cameraId = backCameraId;
                } else {
                    cameraId = frontCameraId;
                }
                cam = Camera.open(cameraId);
                new SurfaceHolderCallback().surfaceChanged(sv.getHolder(), PixelFormat.RGB_565, sv.getWidth(), sv.getHeight());
    
            }
        }
    
        class SurfaceHolderCallback implements SurfaceHolder.Callback {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                int numberOfCameras = Camera.getNumberOfCameras();
                CameraInfo cameraInfo = new CameraInfo();
                for (int i = 0; i < numberOfCameras; i++) {
                    Camera.getCameraInfo(i, cameraInfo);
                    if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
                        backCameraId = i;
                    } else if (cameraInfo.facing == CameraInfo.CAMERA_FACING_FRONT) {
                        frontCameraId = i;
                    }
                }
                if (numberOfCameras > 1) {
                    if (backCameraId != -1) {
                        cameraId = backCameraId;
                    } else if (frontCameraId != -1) {
                        cameraId = frontCameraId;
                    }
                    cam = Camera.open(cameraId);
                } else {
                    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();
            }
        }
    }

    以上で『切替』ボタンをタップすることで、フロントカメラとバックカメラの切替えができるアプリが作成できました。
    スポンサーリンク

    1 件のコメント:

    1. 弾丸サーブ2016/02/08 3:42

      とても参考になりました。
      ありがとうございます。
      Android6.0から権限に関して若干の変更があるようです。
      具体的には、manifestにandroid.permission.WRITE_EXTERNAL_STORAGE等を追記する以外に、実機の方の「設定」->「アプリ」->「自作アプリ」->「許可」でカメラやストレージをオンにしないと例外処理(FileNotFoundException)で落ちます。
      自分もそのパターンで苦悩したので追記した方がいいかもです。

      返信削除