Android Camera2 拍照(三)——切換網路攝影機,延時拍攝和閃光模式

來源:互聯網
上載者:User

標籤:override   note   變數   覆蓋   網路攝影機   http   mod   wim   public   

原文:Android Camera2 拍照(三)——切換網路攝影機,延時拍攝和閃光模式

一、切換網路攝影機

在前後網路攝影機之間切換,首先需要關閉之前開啟的網路攝影機,關閉preview,之後重新開啟新的網路攝影機,重新開啟preview。

public void switchCamera() {        if (mCameraId.equals(CAMERA_FRONT)) {            mCameraId = CAMERA_BACK;            closeCamera();            reopenCamera();        } else if (mCameraId.equals(CAMERA_BACK)) {            mCameraId = CAMERA_FRONT;            closeCamera();            reopenCamera();        }    }

關閉網路攝影機:

/**     * Closes the current {@link CameraDevice}.     */    private void closeCamera() {        try {            mCameraOpenCloseLock.acquire();            synchronized (mCameraStateLock) {                // Reset state and clean up resources used by the camera.                // Note: After calling this, the ImageReaders will be closed after any background                // tasks saving Images from these readers have been completed.                mPendingUserCaptures = 0;                mState = STATE_CLOSED;                if (null != mCaptureSession) {                    mCaptureSession.close();                    mCaptureSession = null;                }                if (null != mCameraDevice) {                    mCameraDevice.close();                    mCameraDevice = null;                }                if (null != mJpegImageReader) {                    mJpegImageReader.close();                    mJpegImageReader = null;                }                if (null != mRawImageReader) {                    mRawImageReader.close();                    mRawImageReader = null;                }            }        } catch (InterruptedException e) {            throw new RuntimeException("Interrupted while trying to lock camera closing.", e);        } finally {            mCameraOpenCloseLock.release();        }    }

開啟新的網路攝影機:

public void reopenCamera() {        if (mTextureView.isAvailable()) {            openCamera();        } else {            mTextureView.setSurfaceTextureListener(mSurfaceTextureListener);        }    }

如果TextureView是available的,那麼直接調用openCamera()開啟camera(openCamera()的代碼參考之前的部落格);如果|TextureView是unavailable的,那麼調用TextureView的setSurfaceTextureListener設定SurfaceTextureListener(參考上一篇部落格)。二、延時拍攝

要實現延時拍攝,核心是實現一個定時器。本例延時分為三種模式:3s延時,10s按時,無延時。可以在三種模式之中自有切換。

private void switchDelayState() {        switch (mDelayState) {            case 0:                mTimer.setImageResource(R.mipmap.ic_3s);                mDelayTime = 3 * 1000;                mDelayState = 1;                break;            case 1:                mTimer.setImageResource(R.mipmap.ic_10s);                mDelayTime = 10 * 1000;                mDelayState = 2;                break;            case 2:                mTimer.setImageResource(R.mipmap.timer);                mDelayTime = 0;                mDelayState = 0;                break;            default:                break;        }    }

變數mDelayTime和mDelaySate的定義:

/*     * Delay state, 0 represents no delay, 1 represents 3s delay, while 2 represents 10s delay     */    private short mDelayState = 0; // Timer    private short mDelayTime;

當拍攝按鈕被點擊時:

@Override    public void onClick(View view) {        switch (view.getId()) {            case R.id.capture: {                if (mDelayState == 0) {                    takePicture();                } else {                    new CountDownTimer(mDelayTime, TIME_INTERVAL) {                        @Override                        public void onTick(long millisUntilFinished) {                            mTimeText.setVisibility(View.VISIBLE);                            mTimeText.setText("" + millisUntilFinished / TIME_INTERVAL);                        }                        @Override                        public void onFinish() {                            mTimeText.setVisibility(View.GONE);                            takePicture();                        }                    }.start();                }                break;            }

但有3s或10s延時的時候,利用CountDownTimer實現倒計時並每隔一秒更新剩餘時間提示,到時候執行拍照功能。三、切換閃光模式

支援自動,強制,禁止閃光。與閃光模式有關的屬性是CaptureRequest.CONTROL_AE_MODE和CaptureRequest.FLASH_MODE。 如果要使用FLASH_MODE屬相,閃光燈必須可用,並且,CONTROL_AE_MODE必須設定為on或off,否則,自動曝光屬性的ON_AUTO_FLASH,ON_ALWAYS_FLASH, ON_AUTO_FLASH_REDEYE將會覆蓋FLASH_MODE的設定。

private void switchFlashMode() {        switch (mFlashMode) {            case 0:                mFlashMode = 1;                mFlashBtn.setImageResource(R.mipmap.flash_auto);                mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);                try {                    mCaptureSession.setRepeatingRequest(                            mPreviewRequestBuilder.build(),                            mPreCaptureCallback, mBackgroundHandler);                } catch (CameraAccessException e) {                    e.printStackTrace();                    return;                }                break;            case 1:                mFlashMode = 2;                mFlashBtn.setImageResource(R.mipmap.flash_on);                mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);                try {                    mCaptureSession.setRepeatingRequest(                            mPreviewRequestBuilder.build(),                            mPreCaptureCallback, mBackgroundHandler);                } catch (CameraAccessException e) {                    e.printStackTrace();                    return;                }                break;            case 2:                mFlashMode = 0;                mFlashBtn.setImageResource(R.mipmap.flash_off);                mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);                mPreviewRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);                try {                    mCaptureSession.setRepeatingRequest(                            mPreviewRequestBuilder.build(),                            mPreCaptureCallback, mBackgroundHandler);                } catch (CameraAccessException e) {                    e.printStackTrace();                    return;                }                break;        }    }

在takePicture()之前,需要再次設定:

private void setFlashMode() {        switch (mFlashMode) {            case 0:                mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);                mPreviewRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);                break;            case 1:                mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);                break;            case 2:                mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);                break;        }    }
代碼參考:https://github.com/gengqifu/361Camera,歡迎fork/star。

Android Camera2 拍照(三)——切換網路攝影機,延時拍攝和閃光模式

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.