http://www.cnblogs.com/yydcdut/p/4202052.html

Camera2

Camera2是Android5.0中的其中一个新的特性,新的API。与原来的camera API相比,不同之处在于:

  • 原生支持RAW照片输出
  • 突发拍摄模式

制约拍照速度的不再是软件而是硬件。以Nexus 5为例,分辨率全开下Andorid L的连拍速度可达到30fps。

  • 全手动控制

快门、感光度、对焦、测光、硬件视频防抖等多种参数都被整合到了新的API内。新的API中添加的手动控制功能列表:

  1. 感光度
  2. 手动对焦/AF开关
  3. AE/AF/AWB模式
  4. AE/AWB锁
  5. 硬件视频防抖
  6. 连续帧

干货

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);
    }
}
10-29 15:27
查看更多