SurfaceView 自定义相机开发
Surfaceview 自定义相机,支持分辨率修改,开关闪光灯,可以切换前后摄像头,拍摄完成存为图片,先上效果图:
MainActicity.java
private Camera camera;
private boolean preview = false;
private ImageView change, takephoto,flash;
private int cameraPosition = 0;
private SurfaceHolder holder;
private ImageView imageView;
private LinearLayout ll_view;
int picWidth = 1920;
int picHeight = 1080;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);// 拍照过程屏幕一直处于高亮
setContentView(R.layout.activity_main);
initView();
ll_view.getBackground().setAlpha(80);
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
holder = surfaceView.getHolder();
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//holder.setFixedSize(1080, 1920);
holder.addCallback(new SurfaceViewCallback());
takephoto.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
camera.autoFocus(new AutoFocusCallback() {// 自动对焦
@Override
public void onAutoFocus(boolean success, Camera camera) {
if (success) {
camera.takePicture(null, null, jpeg);// 将拍摄到的照片给自定义的对象
}
}
});
}
});
change.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
int cameraCount = 0;
CameraInfo cameraInfo = new CameraInfo();
cameraCount = Camera.getNumberOfCameras();// 得到摄像头的个数
for (int i = 0; i < cameraCount; i++) {
Camera.getCameraInfo(i, cameraInfo);// 得到每一个摄像头的信息
if (cameraPosition == 0) {
// 现在是后置,变更为前置
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {// 代表摄像头的方位,CAMERA_FACING_FRONT前置 // CAMERA_FACING_BACK后置
camera.stopPreview();// 停掉原来摄像头的预览
camera.release();// 释放资源
camera = null;// 取消原来摄像头
camera = Camera.open(i);// 打开当前选中的摄像头
try {
camera.setPreviewDisplay(holder);// 通过surfaceview显示取景画面
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
getWH(camera);
setCameraDisplayOrientation(MainActicity.this,cameraPosition, camera,270);
camera.startPreview();// 开始预览
cameraPosition = 1;
break;
}
} else {
// 现在是前置, 变更为后置
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {// 代表摄像头的方位,CAMERA_FACING_FRONT前置 // CAMERA_FACING_BACK后置
camera.stopPreview();// 停掉原来摄像头的预览
camera.release();// 释放资源
camera = null;// 取消原来摄像头
camera = Camera.open(i);// 打开当前选中的摄像头
try {
camera.setPreviewDisplay(holder);// 通过surfaceview显示取景画面
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
getWH(camera);
setCameraDisplayOrientation(MainActicity.this,cameraPosition, camera,0);
camera.startPreview();// 开始预览
cameraPosition = 0;
break;
}
}
}
}
});
flash.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
setFlashMode();
}
});
}