相机基础
概念
Camera是系统对外提供控制手机摄像头的类
- Camera1 谷歌出的第一代相机API,布局 SurfaceView
- Camera2 Android 5.0对拍照API进行了全新的设计,功能会更精细,支持RAW照片输出,甚至允许程序调整相机的对焦模式、曝光模式、快门等,但是跟camera1 不兼容。布局: TextureView
详细参考:Camera1与Camera2区别
Camera2完全解析
SurfaceView, GlSurfaceView, TextureView 的区别
SurfaceView 出现最早, 解决类似视频播放的问题(可以用单独一个线程来渲染UI)。
后来发现用起来不方便, 渲染线程需要单独编写, 一大堆都可以独立成模板。
所以后来就出现了 GLSurfaceView, 概括一句话就是 使用了模板的 SurfaceView。
再后来发现GLSurfaceView不能根据屏幕的变化而变化, 这是由于GLSurfaceView同应用的Surface不是在同一层导致的问题。
人们就想到把这个GLSurfaceView弄到应用的Surface中, 所以就产生了TextureView.
SurfaceTexture,TextureView, SurfaceView和GLSurfaceView
相机启动流程
1. 权限申请
需要动态申请:android.permission.CAMERA
2. 调用前的准备工作
- 获取相机所支持的摄像头
int numberOfCameras = Camera.getNumberOfCameras();// 获取摄像头个数
for (int cameraId = 0; cameraId < numberOfCameras; cameraId++) {
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
Camera.getCameraInfo(cameraId, cameraInfo);
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
// 后置摄像头
} else if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
// 前置摄像头
}
}
- 其他可以配置类:CameraCharacter, Camera.Parameters 等
3. 初始化相机
- 初始化Camera类
mCamera = new Camera(this, isCamera2);
mCamera.setCamera3aListener(this);
mCamera.setCameraFocusListener(this);
mCamera.setCameraPermissionListener(this);
mCamera.setCameraPictureListener(this);
mCamera.setCameraPreviewListener(this);
mCamera.setCameraStatusListener(this);
mCamera.setCameraZoomListener(this);
//或者:mCamera.setSurface(surfaceView);
mCamera.setSurface(textureView);
4. 开启相机
mCamera.setPreviewSize(preview);
mCamera.setPictureSize(picture);
mCamera.startPreview();
5. 停止相机
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause");
mCamera.stopPreview();
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop");
mCamera.closeCamera(mCamera.getCurrentCameraId());
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
mCamera.release();
}