Camera简要说明
Camera是Android摄像头硬件的相机类,位于包"android.hardware.camera"下。它主要用于摄像头捕获图片、启动/停止预览图片、拍照、获取视频帧等,在Google 推出Android 5.0的时候, 被废弃。
源码地址
https://github.com/WuKaik/QuickCamera1
使用简要说明
- 先调用Camera.getNumberOfCameras()获取系统摄像头数量,获取指定摄像头Id
- 通过Camera.open(int cameraId)返回一个camera,若调用Camera.open(),默认打开后置摄像头
- 利用camera.getParameters()得到相机默认设置Camera.Parameters,如需修改,修改Camera.Parameters并调用camera.setParameters(Camera.Parameters)来修改设置
- 调用camera.setDisplayOrientation(int)来设置正确的预览方向
- 调用camera.setPreviewDisplay(SurfaceHolder)来设置预览
- 调用camera.startPreview()来开启预览,预览数据在预览接口回调camera.setPreviewCallback()中获取
- 调用camera.takePicture()拍照,拍照数据在拍照接口回调Camera.PictureCallback() 中获取
需要注意的地方
- 拍摄照片后,相机会停止预览,如需继续预览,需要再次调用camera.startPreview()重新开始预览
- 在Activity的onPause()方法,需要释放Camera资源;onResume()方法,重新获取Camera开启预览
主要代码截图
预览代码:
/**
* 开启预览
* @param camera
* @param holder
*/
private void startPreview(Camera camera, SurfaceHolder holder)
{
try {
camera.setPreviewDisplay(holder);
//可根据自己需求调整
//camera.setDisplayOrientation(90);
camera.setPreviewCallback(new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
Log.d(TAG, "onPreviewFrame: data size:"+data.length);
}
});
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
拍照代码:
mCamera.takePicture(null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Log.d(TAG, "onPictureTaken: 接收到拍照后的数据");
File tempFile = new File(Environment.getExternalStorageDirectory().getPath() + "/image.png");
FileOutputStream fos = null;
try {
fos = new FileOutputStream(tempFile);
fos.write(data);
Toast.makeText(MainActivity.this, "拍照成功", Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//重新开始预览
startPreview(mCamera, mHolder);
}
}
});