ZXing掃描二維碼 開啟和關閉,閃光燈
阿新 • • 發佈:2019-01-30
最近專案掃描藥品的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;
}
}
};