Android實現二維碼掃描功能(三)-閃光燈控制
阿新 • • 發佈:2018-12-30
簡介
本篇我們對光線暗淡情況下閃光燈的使用做出介紹。
效果
晚上測試時:
- 開燈後:
- 未開燈:
實現步驟
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();
}
}
};
執行即可檢視效果。