简介
上一篇Android实现二维码扫描功能(二)-ZXing个性化与近距离识别优化介绍了ZXing框架个性化定制和识别优化方法。
本篇我们对光线暗淡情况下闪光灯的使用做出介绍。
效果
晚上测试时:
- 开灯后:
- 未开灯:
实现步骤
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();
}
}
};
运行即可查看效果。
参考
http://iluhcm.com/2016/01/08/scan-qr-code-and-recognize-it-from-picture-fastly-using-zxing/
源码下载
源码已上传csdn,前往下载:(旧版)
http://download.csdn.net/detail/ahuyangdong/9922913
Github项目地址(保持更新),已基本解决相册选图的适配问题:
https://github.com/ahuyangdong/QrCodeDemo4