
http://www.cnblogs.com/yydcdut/p/4202052.html
Camera2
Camera2是Android5.0中的其中一个新的特性,新的API。与原来的camera API相比,不同之处在于:
制约拍照速度的不再是软件而是硬件。以Nexus 5为例,分辨率全开下Andorid L的连拍速度可达到30fps。
快门、感光度、对焦、测光、硬件视频防抖等多种参数都被整合到了新的API内。新的API中添加的手动控制功能列表:
- 感光度
- 手动对焦/AF开关
- AE/AF/AWB模式
- AE/AWB锁
- 硬件视频防抖
- 连续帧
干货
Camera2 程序逻辑与原Camera有很大不同。
CameraManager,系统服务,通过 CameraManager去获得camera设备对象。CameraDevices提供描述相机硬件设备支持可用的和输出的参数,这些信息通过 CameraCharacteristics获得uses-permission LinearLayout TextureView LinearLayout>
核心代码
public class CameraFragment extends Fragment implements TextureView.SurfaceTextureListener { private TextureView mPreviewView; private Handler mHandler; private HandlerThread mThreadHandler; private Size mPreviewSize; private CaptureRequest.Builder mPreviewBuilder; public static CameraFragment newInstance() { return new CameraFragment();
}
@SuppressWarnings("ResourceType")
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.camera_frag, null);
initLooper();
initUIAndListener(v); return v;
} //很多过程都变成了异步的了,所以这里需要一个子线程的looper private void initLooper() {
mThreadHandler = new HandlerThread("CAMERA2");
mThreadHandler.start();
mHandler = new Handler(mThreadHandler.getLooper());
} //可以通过TextureView或者SurfaceView private void initUIAndListener(View v) {
mPreviewView = (TextureView) v.findViewById(R.id.textureview);
mPreviewView.setSurfaceTextureListener(this);
}
@SuppressWarnings("ResourceType")
@Override public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { try { //获得CameraManager CameraManager cameraManager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE); //获得属性 CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics("0"); //支持的STREAM CONFIGURATION StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); //显示的size mPreviewSize = map.getOutputSizes(SurfaceTexture.class)[0]; //打开相机 cameraManager.openCamera("0", mCameraDeviceStateCallback, mHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
}
@Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { return false;
} //TextureView.SurfaceTextureListener @Override public void onSurfaceTextureUpdated(SurfaceTexture surface) {
} private CameraDevice.StateCallback mCameraDeviceStateCallback = new CameraDevice.StateCallback() {
@Override public void onOpened(CameraDevice camera) { try {
startPreview(camera);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override public void onDisconnected(CameraDevice camera) {
}
@Override public void onError(CameraDevice camera, int error) {
}
}; //开始预览,主要是camera.createCaptureSession这段代码很重要,创建会话 private void startPreview(CameraDevice camera) throws CameraAccessException {
SurfaceTexture texture = mPreviewView.getSurfaceTexture();
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
Surface surface = new Surface(texture); try {
mPreviewBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
} catch (CameraAccessException e) {
e.printStackTrace();
}
mPreviewBuilder.addTarget(surface);
camera.createCaptureSession(Arrays.asList(surface), mSessionStateCallback, mHandler);
} private CameraCaptureSession.StateCallback mSessionStateCallback = new CameraCaptureSession.StateCallback() {
@Override public void onConfigured(CameraCaptureSession session) { try {
updatePreview(session);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override public void onConfigureFailed(CameraCaptureSession session) {
}
}; private void updatePreview(CameraCaptureSession session) throws CameraAccessException {
session.setRepeatingRequest(mPreviewBuilder.build(), null, mHandler);
}
}