1. 程式人生 > >ZXing掃描二維碼 開啟和關閉,閃光燈

ZXing掃描二維碼 開啟和關閉,閃光燈

最近專案掃描藥品的ZXing,產品要加一個開啟和關閉閃光燈的功能(燈光暗的時候可以滿足使用者掃碼的需求),最後我會貼上我的程式碼

注意點:

問題一:在ZXing的CaptureActivity中,我們不能再建立Camera物件,因為系統就只有一個Camera物件,並且ZXing的原始碼中已經幫我們建立好了,使用我們這裡不能再建立

*不然丟擲,Fail to connect to camera service 異常

*看原始碼ZXing原始碼:

//已經幫我們建立好了Camera
public void openDriver(SurfaceHolder holder) throws
IOException { if (camera == null) { camera = Camera.open(); //原始碼就建立好了camear if (camera == null) { throw new IOException(); } camera.setPreviewDisplay(holder); if (!initialized) { initialized = true
; configManager.initFromCameraParameters(camera); } configManager.setDesiredCameraParameters(camera); // SharedPreferences prefs = // PreferenceManager.getDefaultSharedPreferences(context); // if (prefs.getBoolean(PreferencesActivity.KEY_FRONT_LIGHT, false))
// { // FlashlightManager.enableFlashlight(); // } FlashlightManager.enableFlashlight(); } }

*解決辦法:
我們在ZXing的CameraManager中寫一個方法獲取到camare物件(給CaptureActivity獲取這個相機物件)

    /**
     * 獲取相機的方法
     * @return camera
     */
    public static Camera getCamera(){
        return camera;
    }

問題二:關閉閃光燈的時候丟擲 at android.hardware.Camera.setOneShorPreviewCallback(Camera.java…)異常,這個問題的原因是:ZXing原始碼中已經幫我們做了銷燬了

*看程式碼

    public static void stopPreview() {
        if (camera != null && previewing) {
            if (!useOneShotPreviewCallback) {
                camera.setPreviewCallback(null);
            }
            camera.stopPreview();
            previewCallback.setHandler(null, 0);
            autoFocusCallback.setHandler(null, 0);
            previewing = false;
        }
    }

*解決方式:我沒在CaptureActivity的surfaceDestroyed()方法中,呼叫CameraManager類中的stopPreview();釋放資源(ZXing原始碼裡面就幫我們做了,我們只需要呼叫下即可)

    /**
     * 這裡釋放資源
     */
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {        
        hasSurface = false;     
         if (camera != null) {
            CameraManager.stopPreview();
         }
    }

問題分析完了,這裡我們就可以開始開啟和關閉閃光燈的邏輯了,看程式碼(必須把我前面分析的問題處理完,在開始需求邏輯的處理,不然會報錯)

//初始化view,並且設定點選事件開啟和關閉閃光燈
    private void initFindView() {
        tv_open_light = (TextView) findViewById(R.id.tv_open_light);
        tv_open_light.setOnClickListener(openListener);

    }

    /**
     * 開燈
     */

    private OnClickListener openListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            //獲取到ZXing相機管理器建立的camera
            camera = CameraManager.getCamera();
            parameter = camera.getParameters();
            // TODO 開燈
            if (isOpen) {
                tv_open_light.setText("關燈");
                parameter.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                camera.setParameters(parameter);
                isOpen = false;
            } else {  // 關燈
                tv_open_light.setText("開燈");
                parameter.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
                camera.setParameters(parameter);
                isOpen = true;
            }
        }
    };

最後到此為止ZXing開啟和關閉閃光燈,完成了,下面分享個Deom