- 由 178903294创建, 最后修改于1月 20, 2020
在VideoMode.java中 当拍照键按下
VideoMode.java
private View.OnClickListener mVssListener = new View.OnClickListener() {
public void onClick(View view) {
~ LogHelper.i(TAG, "[mVssListener] bjq click video state = " + mVideoState + "mCanTakePicture = " + mCanTakePicture); if ((getVideoState() == VideoState.STATE_PAUSED || getVideoState() == VideoState.STATE_RECORDING) && mCanTakePicture) {
mAppUi.animationStart(IAppUi.AnimationType.TYPE_CAPTURE, null ); mCameraDevice.updateGSensorOrientation(mApp.getGSensorOrientation()); mCameraDevice.takePicture(mJpegCallback); mCanTakePicture = false ; } } }; |
调用mCameraDevice.takePicture(mJpegCallback); 这里面的mJpegCallback 是处理数据回调保存的函数
VideoDevice2Controller.java
@Override public void takePicture( @Nonnull JpegCallback callback) {
~ LogHelper.e(TAG, "[takePicture] bjq +" ); mJpegCallback = callback; CaptureRequest.Builder builder; try {
builder = mCamera2Proxy.createCaptureRequest(Camera2Proxy.TEMPLATE_VIDEO_SNAPSHOT); configureQuickPreview(builder); builder.addTarget(mPreviewSurface); builder.addTarget(mRecordSurface); builder.addTarget(mCaptureSurface.getSurface()); + builder.set(CaptureRequest.CONTROL_AE_MODE, //加入这个自动白平衡 暗光条件下录像过程中拍照一片黑暗的问题就临时解决了 + CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); int rotation = CameraUtil.getJpegRotation(Integer.parseInt(mCameraId), mJpegRotation, mActivity); builder.set(CaptureRequest.JPEG_ORIENTATION, rotation); mSettingDevice2Configurator.configCaptureRequest(builder); mSession.capture(builder.build(), mCaptureCallback, mModeHandler); } catch (CameraAccessException e) {
e.printStackTrace(); } ~ LogHelper.e(TAG, "[takePicture] bjq -" ); } |
mCamera2Proxy.createCaptureRequest(Camera2Proxy.TEMPLATE_VIDEO_SNAPSHOT) 这里定义了拍照的模式:TEMPLATE_VIDEO_SNAPSHOT 视频快门模式
接着调用 mSession.capture(builder.build(), mCaptureCallback, mModeHandler); 注意这里传入了一个Handler 以后会用到
Camera2CaptureSessionProxy.java
public int capture( @Nonnull CaptureRequest request, @Nullable CaptureCallback listener, @Nullable Handler handler) throws CameraAccessException {
int [] captureNum = new int [ 1 ]; List<CaptureRequest> requestList = new ArrayList<>(); requestList.add(request); SessionOperatorInfo info = new SessionOperatorInfo(requestList, listener, handler, captureNum); Message msg = mRequestHandler.obtainMessage(Camera2Actions.CAPTURE, info); mAtomAccessor.sendAtomMessageAndWait(mRequestHandler, msg); return captureNum[ 0 ]; } |
调用mAtomAccessor.sendAtomMessageAndWait(mRequestHandler, msg);
AtomAccessor.java
public void sendAtomMessageAtFrontOfQueue(Handler handler, Message msg) {
if (handler == null || msg == null ) {
return ; } acquireResource(); + LogHelper.i(TAG, "bjq sendAtomMessageAtFrontOfQueue" ); handler.sendMessageAtFrontOfQueue(msg); releaseResource(); } |
接着调用Handler.java的sendMessageAtFrontOfQueue 加入消息队列并处理对应的handel
Handler.java
public final boolean sendMessageAtFrontOfQueue(Message msg) {
MessageQueue queue = mQueue; if (queue == null ) {
RuntimeException e = new RuntimeException( this + " sendMessageAtTime() called with no mQueue" ); Log.w( "Looper" , e.getMessage(), e); return false ;
|