Android自定义相机Camera+SurfaceView
<1>界面使用SurfaceView控件,显示照相机的画面
<2>SurfaceView接受摄像头界面变化的信息
surfaceView.getHolder().addCallback()
<3>重写三个方法
surfaceDestroyed—>当预览界面关闭时,触发
一般在这里执行销毁照相机的操作,释放内存
camera.stopPreview();
camera.release();
camera = null;
surfaceCreated—–>预览界面被创建时,调用
一般在这里打开照相机和设置照相机的一些参数
// 打开摄像头
camera = Camera.open();
// 给摄像头设置参数
Parameters parameters = camera.getParameters();
// 设置每秒3栈
parameters.setPreviewFrameRate(3);
// 设置照片的输出格式
parameters.setPictureFormat(PixelFormat.JPEG);
// 设置照片的质量
parameters.set("jpeg-quality", 85);
// 给照相机设置参数
camera.setParameters(parameters);
//将摄像头的画面显示到SurfaceView控件上
camera.setPreviewDisplay(sv_main_camera.getHolder());
// 开始预览
camera.startPreview();
surfaceChanged----->当预览界面的格式和大小发生改变时,触发
<4>保存
camera.takePicture
将照片保存到内存卡(压缩)
还是老规矩先看效果图:
摄像头是手机硬件部分,所以要加权限:
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
下面看代码:
public class CameraActivity extends AppCompatActivity {
private SurfaceView sv_camera_surfaceview;
private Camera camera;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
//获取SurfaceView
sv_camera_surfaceview = (SurfaceView) findViewById(R.id.sv_camera_surfaceview);
sv_camera_surfaceview.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
//打开摄像头
camera = Camera.open();
//设置相机参数
Camera.Parameters parameters=camera.getParameters();
parameters.setPictureFormat(PixelFormat.JPEG);// 设置照片的输出格式
parameters.set("jpeg-quality",85);// 设置照片的质量
camera.setParameters(parameters);// 给照相机设置参数
mySetDisplayOrientation(CameraActivity.this,0);
//讲摄像头的画面展示到SurfaceView
try {
camera.setPreviewDisplay(sv_camera_surfaceview.getHolder());
} catch (IOException e) {
e.printStackTrace();
}
//开启预览
camera.startPreview();
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
}
});
}
//拍照的方法
public void getImage(View view){
camera.takePicture(null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] bytes, Camera camera) {
Bitmap bitmap=BitmapFactory.decodeByteArray(bytes,0,bytes.length);
//将字节数组转成图片
try {
String sdPath= Environment.getExternalStorageDirectory().getAbsolutePath();
FileOutputStream fos=new FileOutputStream(sdPath+"/taoge"+System.currentTimeMillis()+".png");
Log.i("test",sdPath);
bitmap.compress(Bitmap.CompressFormat.PNG,85,fos);
camera.stopPreview();
camera.startPreview();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
});
}
private void mySetDisplayOrientation(Activity activity, int cameraId) { // 调整摄像头方向
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(cameraId, info);
int rotation = activity.getWindowManager().getDefaultDisplay()
.getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0:
degrees = 0;
break;
case Surface.ROTATION_90:
degrees = 90;
break;
case Surface.ROTATION_180:
degrees = 180;
break;
case Surface.ROTATION_270:
degrees = 270;
break;
}
int result;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360; // compensate the mirror
} else {
// back-facing
result = (info.orientation - degrees + 360) % 360;
}
camera.setDisplayOrientation(result);
}
@Override
protected void onDestroy() {
super.onDestroy();
//当界面关闭时,关闭相机
camera.stopPreview();
camera.release();
}
}