以下の記事をベースに作成しました。
関連記事
フロントカメラとバックカメラを切替えるアプリの作成
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();
}
}
}
以上で『切替』ボタンをタップすることで、フロントカメラとバックカメラの切替えができるアプリが作成できました。
とても参考になりました。
返信削除ありがとうございます。
Android6.0から権限に関して若干の変更があるようです。
具体的には、manifestにandroid.permission.WRITE_EXTERNAL_STORAGE等を追記する以外に、実機の方の「設定」->「アプリ」->「自作アプリ」->「許可」でカメラやストレージをオンにしないと例外処理(FileNotFoundException)で落ちます。
自分もそのパターンで苦悩したので追記した方がいいかもです。