1. 程式人生 > >Android實現二維碼掃描功能(三)-閃光燈控制

Android實現二維碼掃描功能(三)-閃光燈控制

簡介

本篇我們對光線暗淡情況下閃光燈的使用做出介紹。

效果

晚上測試時:

  • 開燈後:
    開燈效果圖
  • 未開燈:
    未開燈效果圖

實現步驟

1、在activity_scanner.xml介面上加上閃光燈開關按鈕。可以是Button、Checkbox等控制元件。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    ...>

    ...

    <FrameLayout
        ...
> <SurfaceView .../> <com.google.zxing.view.ViewfinderView ... /> <ImageButton android:id="@+id/btn_flash" android:layout_width="40dip" android:layout_height="40dip" android:padding="6dip"
android:layout_gravity="bottom|center_horizontal" android:layout_marginBottom="30dip" android:background="?attr/selectableItemBackground" android:scaleType="centerInside" android:src="@drawable/flash_off" /> </FrameLayout> </LinearLayout>

編輯區域預覽
編輯區域預覽

2、修改com.google.zxing.camera.CameraManager類,新增setFlashLight方法。

/**
     * 開啟或關閉閃光燈
     * @param isOpen 是否開啟閃光燈
     * @return boolean 操作成功/失敗。
     */
    public boolean setFlashLight(boolean isOpen) {
        if (camera == null || !previewing) {
            return false;
        }
        Camera.Parameters parameters = camera.getParameters();
        if (parameters == null) {
            return false;
        }
        List<String> flashModes = parameters.getSupportedFlashModes();
        // 檢查手機是否有閃光燈
        if (null == flashModes || 0 == flashModes.size()) {
            // 沒有閃光燈則返回
            return false;
        }
        String flashMode = parameters.getFlashMode();
        if (isOpen) {
            if (Camera.Parameters.FLASH_MODE_TORCH.equals(flashMode)) {
                return true;
            }
            // 開啟
            if (flashModes.contains(Camera.Parameters.FLASH_MODE_TORCH)) {
                parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                camera.setParameters(parameters);
                return true;
            } else {
                return false;
            }
        } else {
            if (Camera.Parameters.FLASH_MODE_OFF.equals(flashMode)) {
                return true;
            }
            // 關閉
            if (flashModes.contains(Camera.Parameters.FLASH_MODE_OFF)) {
                parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
                camera.setParameters(parameters);
                return true;
            } else {
                return false;
            }
        }
    }

3、在com.google.zxing.activity.CaptureActivity類中新增閃光燈開關相關程式碼。

btnFlash = (ImageButton) findViewById(R.id.btn_flash);
btnFlash.setOnClickListener(flashListener);

/**
 *  閃光燈開關按鈕
 */
private View.OnClickListener flashListener = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        try {
            boolean isSuccess = CameraManager.get().setFlashLight(!isFlashOn);
            if(!isSuccess){
                Toast.makeText(CaptureActivity.this, "暫時無法開啟閃光燈", Toast.LENGTH_SHORT).show();
                return;
            }
            if (isFlashOn) {
                // 關閉閃光燈
                btnFlash.setImageResource(R.drawable.flash_off);
                isFlashOn = false;
            } else {
                // 開啟閃光燈
                btnFlash.setImageResource(R.drawable.flash_on);
                isFlashOn = true;
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
};

執行即可檢視效果。

參考

原始碼下載