博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
修正Android基于ZXing的二维码扫描——横竖屏自由切换
阅读量:4685 次
发布时间:2019-06-09

本文共 2775 字,大约阅读时间需要 9 分钟。

概述:

  此博客是基于开源的框架ZXing。ZXing用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口。ZXing可以实现使用手机的内置的摄像头完成条形码的扫描及解码。该项目可实现的条形码编码和解码。

资源下载:

修改为竖屏显示:

第1步:

进入com.google.zxing.client.android包下的CaptureActivity类:

注释以下代码:

if (prefs.getBoolean(PreferencesActivity.KEY_DISABLE_AUTO_ORIENTATION, true)) {            setRequestedOrientation(getCurrentOrientation());        } else {            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);        }

第2步:

进入com.google.zxing.client.android包下的DecodeHandler类:

在代码

PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(data, width, height);
上面添加:

byte[] rotatedData = new byte[data.length];            for (int y = 0; y < height; y++) {                for (int x = 0; x < width; x++)                    rotatedData[x * height + height - y - 1] = data[x + y * width];            }            int tmp = width; // Here we are swapping, that's the difference to #11            width = height;            height = tmp;            data = rotatedData;

第3步:

进入com.google.zxing.client.android.camera包下的CameraConfigurationManager类:

在Log.i(TAG, "Screen resolution: " + screenResolution)的下面添加:

Point screenResolutionForCamera = new Point();screenResolutionForCamera.x = screenResolution.x;screenResolutionForCamera.y = screenResolution.y;if (screenResolution.x < screenResolution.y) {    screenResolutionForCamera.x = screenResolution.y;    screenResolutionForCamera.y = screenResolution.x;}cameraResolution = CameraConfigurationUtils.findBestPreviewSizeValue(parameters, screenResolutionForCamera);

第4步:

进入com.google.zxing.client.android.camera包下的CameraConfigurationManager类:

在代码camera.setParameters(parameters)的上面添加:

camera.setDisplayOrientation(90);

第5步:

进入com.google.zxing.client.android.camera包下的CameraManager类:

将代码:

rect.left = rect.left * cameraResolution.x / screenResolution.x;                rect.right = rect.right * cameraResolution.x /                screenResolution.x;                rect.top = rect.top * cameraResolution.y / screenResolution.y;                rect.bottom = rect.bottom * cameraResolution.y /                screenResolution.y;
替换成:

rect.left = rect.left * cameraResolution.y / screenResolution.x;                rect.right = rect.right * cameraResolution.y / screenResolution.x;                rect.top = rect.top * cameraResolution.x / screenResolution.y;                rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;

横竖屏自由切换:

  上面的5步操作会让原本横屏扫描变为竖屏扫描。不过只能是一个方向上的。如果你想让用户可以在横屏和竖屏两种情况下都能使用的话,就要做一些必要的处理了。

  主要的思路就是,设置一个标志位Flag来标志当前的横竖屏状态。Flag是在扫描界面CaptureActivity的onResume的时候进行变换,并对外提供getter接口。不过在我的代码中还用到了一点就是使用EventBus框架来发布信息。

横竖屏情况下的对比图:

注:图中扫描的对象是其他的事物,要是对准了真实的二维码,那就可能截不到其扫描的屏幕了。本博客指在说明ZXing的横竖屏切换问题。

竖屏

横屏

转载于:https://www.cnblogs.com/fengju/p/6336074.html

你可能感兴趣的文章
Java并发编程
查看>>
[转]MySQL数据库管理常用命令
查看>>
Git Stash用法
查看>>
线程与同步
查看>>
co源码解读
查看>>
Page directive must not have multiple occurrences of pageencoding
查看>>
Oracle获取异常的具体出处dbms_utility.format_error_backtrace
查看>>
Python爬虫技巧
查看>>
javascript C# 兼容的DES Base64加密/解密方法 整理
查看>>
利用$(window).resize()实现窗口大小自适应宽度问题
查看>>
OggVorbis 小记
查看>>
hibernate中多表映射关系配置
查看>>
react 高阶组件
查看>>
msi微星B350M主板开启VT(Virtualization Technology)
查看>>
java中可达对象和不可达对象
查看>>
react 路由跳转刷新页面参数消失
查看>>
Android 读取文件内容
查看>>
sql server 2008学习8 sql server存储和索引结构
查看>>
Jquery radio选中
查看>>
《Visual C++ 2010入门教程》系列二:安装、配置和首次使用VS2010
查看>>