写在前面的话

感谢ZXing团队,项目下载地址:https://github.com/zxing/zxing,项目下载后,Android条码扫描主要用到三个模块:android,android-core,core。zxing项目解压后目录结构如图所示:

android是ZXing提供的条码扫描器apk客户端源码,android-core和core是需要的类库。本文提供的zxing竖屏扫描解决方案采用的android版本号versionName为4.7.4,versionCode为104,zxing类库版本号为3.2.0,理论上4.7.x通用。
zxing类库无法直接导入Eclipse,笔者采用的方式是新建工程ZXLib后,将android-core,core中的java代码拷贝进去,注意android-core中只有一个CameraConfigurationUtils.java类,主要类库是core,CameraConfigurationUtils.java的包名:com.google.zxing.client.android.camera,拷贝进去时需要与core类库的相应包名对应,最后别忘记将这个工程设置为library。

友情提示:本文提供解决方案,类库源码不进行任何修改,以下提到的修改部分均为客户端源码。

更新于2016.6.10

笔者已经将改好后的zxing项目portraitzxing上传到github了,类库基于zxinglib v3.2.1,客户端源码基于zxingclient v4.7.6。

项目特色:1.竖屏扫描二维码客户端;2.向下兼容至Android api 9(android 2.3);3.portraitzxing兼顾Eclipse和Android Studio IDE使用者,分为Eclipse版和Android Studio版。是您zxing竖屏扫描二维码的最优解决方案。

竖屏zxing链接:PortraitZXing:https://github.com/xiong-it/PortraitZXing

zxing如何竖屏扫描

将zxing源码android导入Eclipse后,关联ZXLib,也就是刚才新建的ZXing类库。运行后可直接使用条码扫描功能,可是默认是横屏,笔者项目中需要使用竖屏方式扫描,于是需要将zxing条码扫描改成竖屏方式扫描。步骤写的有些细致,请耐心阅读。

第一步:修改AndroidManifest工程清单,AndroidManifest中CaptureActivity的screenOrientation属性改为portrait:

[html] view plaincopyprint?
  1. <activity android:name=“.CaptureActivity”
  2. android:screenOrientation=“portrait”
  3. android:clearTaskOnLaunch=“true”
  4. android:stateNotNeeded=“true”
  5. android:theme=“@style/CaptureTheme”
  6. android:windowSoftInputMode=“stateAlwaysHidden”>
<activity android:name=".CaptureActivity"android:screenOrientation="portrait"android:clearTaskOnLaunch="true"android:stateNotNeeded="true"android:theme="@style/CaptureTheme"android:windowSoftInputMode="stateAlwaysHidden">

第二步:删除CaptureActivity中把onResume方法中的无用代码:

[java] view plaincopyprint?
  1. //    if (prefs.getBoolean(PreferencesActivity.KEY_DISABLE_AUTO_ORIENTATION, true)) {
  2. //      setRequestedOrientation(getCurrentOrientation());
  3. //    } else {
  4. //      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
  5. //    }
//    if (prefs.getBoolean(PreferencesActivity.KEY_DISABLE_AUTO_ORIENTATION, true)) {
//      setRequestedOrientation(getCurrentOrientation());
//    } else {
//      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
//    }

第三步:在CaptureActivity中把onCreate方法结尾处添加代码:

[java] view plaincopyprint?
  1. if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
  2. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  3. } else {
  4. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  5. }
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);} else {setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);}

经过前三步,条码扫描器已经竖屏了,相信很多人也改到这里就出现问题了,zxing条码扫描器相机预览方向旋转了90度,并且容易拉伸,我们需要纠正相机预览方向。

第四步:在CameraConfigurationManager的setDesiredCameraParameters方法中添加代码:

[java] view plaincopyprint?
  1. camera.setDisplayOrientation(90);//add 这句代码作用是旋转镜头90度,使相机预览方向正确显示
  2. camera.setParameters(parameters);
camera.setDisplayOrientation(90);//add 这句代码作用是旋转镜头90度,使相机预览方向正确显示
camera.setParameters(parameters);

相机预览正常了,也没有拉伸,可是二维码识别却慢了许多,并且一维条码识别不出来,需要横屏扫描才可以识别,而且条码成像仍然是横向的,下面步骤将解决这个问题。

第五步:修改CameraManager中getFramingRectInPreview方法:

[java] view plaincopyprint?
  1. //      rect.left = rect.left * cameraResolution.x / screenResolution.x;
  2. //      rect.right = rect.right * cameraResolution.x / screenResolution.x;
  3. //      rect.top = rect.top * cameraResolution.y / screenResolution.y;
  4. //      rect.bottom = rect.bottom * cameraResolution.y / screenResolution.y;
  5. rect.left = rect.left * cameraResolution.y / screenResolution.x;
  6. rect.right = rect.right * cameraResolution.y / screenResolution.x;
  7. rect.top = rect.top * cameraResolution.x / screenResolution.y;
  8. rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;
//      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;

第六步:修改DecodeHandler中的decode(byte[] data, int width, int height)方法:

[java] view plaincopyprint?
  1. PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(data, width, height);
PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(data, width, height);

前添加代码

[java] view plaincopyprint?
  1. byte[] rotatedData = new byte[data.length];
  2. for (int y = 0; y < height; y++) {
  3. for (int x = 0; x < width; x++)
  4. rotatedData[x * height + height - y - 1] = data[x + y * width];
  5. }
  6. int tmp = width;
  7. width = height;
  8. height = tmp;
  9. data = rotatedData;
    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;width = height;height = tmp;data = rotatedData;

更新

更新于2016.6.10

笔者已经将改好后的zxing项目上传到github了,类库基于zxinglib v3.2.1,客户端源码基于zxingclient v4.7.6。

项目特色:客户端向下兼容至Android api 9(Android 2.3),竖屏扫描二维码。绝对是您zxing竖屏扫描解决最优方案。

竖屏zxing链接:PortraitZXing:https://github.com/xiong-it/PortraitZXing

结束语

只进行了第五步,而没有第六步,会在zxing类库的CameraConfigurationUtils 283行抛出异常

[plain] view plaincopyprint?
  1. IllegalStateException(“Parameters contained no preview size!”);
IllegalStateException("Parameters contained no preview size!");

如果只进行了第六步,而没有第五步,则无法正常识别条码。

好了,经过以上六步,zxing条码扫描器已经可以正常竖屏扫描了,剩下的工作就是精简代码了,祝大家顺利完成项目。
转载请注明作者xiong_it和原文出处:http://blog.csdn.net/xiong_it/article/details/46983293,谢谢!

小米4c变形,导致扫不出来

首先高宽比计算公式没有修改,
小米4c的摄像头存在多种分辨率,使用的默认分辨率的高宽比,与屏幕的高宽比不一致,差异较大,导致屏幕扭曲,所以修改以下代码可以完成,也可以直接强制直接使用屏幕的分辨率,不去遍历最高的分辨率

findBestPreviewSizeValue的功能就是寻找最合适的camara分辨率,要满足两个条件,最高像素+高宽比接近屏幕的高宽比

CameraConfigurationUtils
findBestPreviewSizeValue的
double screenAspectRatio = (double) screenResolution.x / (double) screenResolution.y;
改为double screenAspectRatio = (double) screenResolution.y / (double) screenResolution.x;(纵向的高宽比需要调换过来)
并且把private static final double MAX_ASPECT_DISTORTION = 0.15;值改为0.1(小米4c的最高2048/1080-1920/1080 = 0.12 < 0.15,使用2048*1080分辨率的话一维码还是扫不出来,所以改为了0.1)

ZXing条码扫描----竖屏解决方案相关推荐

  1. android 条码扫描控件,Android Zxing条码扫描自定义控件(附代码)

    团队要做一个项目,里面要用到条码扫描,搜了一下,知道了Zxing.这是一个开源的条码扫描程序.官方网站有完整的Android程序可下载.但是,如果想将扫描功能融合在自己开发的程序里,则需要理清设计的思 ...

  2. Zxing条码扫描二维码扫描简化

    最近需要用到条码扫描二维码扫描的功能,于是搜索到google开源项目zxing,项目地址:http://code.g....com/p/zxing/ 下载了源代码,项目太大了,很多东西都不需要用到,我 ...

  3. 强制横屏或竖屏解决方案

    第一种:通过人为的办法改变view.transform的属性. 具体办法: view.transform一般是View的旋转,拉伸移动等属性,类似view.layer.transform,区别在于Vi ...

  4. 条码扫描二维码扫描——ZXing android

    一. ZXing android 源码简化 二. Android Zxing 扫描条码实现竖屏模式 Camera摄像头 旋转90度 Android Zxing 扫描条码实现竖屏模式(portrait ...

  5. CameraX + Zxing 竖屏实现 一维码、二维码扫描

    分为两步 一.获取图像数据 二.利用zxing分析图像数据 下面先看下识别效果 识别效果 这个demo是直接基于官方demo修改而成的,有兴趣的小伙伴可以直接上官网下载去 一.获取图像数据 首先我们需 ...

  6. Android二维码识别率优化,Android Zxing 转换竖屏扫描且提高识别率的方法

    最近的一个Android需要用到扫码功能,用的是Zxing开源库.Zxing的集成就不说了,但是Zxing默认的是横屏扫码,在实际生产中并不适用,需要改为竖屏扫描. 转竖屏步骤: 1>. And ...

  7. 解决Android二维码扫描ZXing竖屏拉伸变长闪退扫描区域小等问题

    Android 基于google Zxing实现二维码.条形码扫描,仿微信二维码扫描效果 这篇文章写的不错,但是按照这篇文章使用二维码的话会出现竖屏扫描图像拉伸变长的问题(有一个地方计算错误),解决拉 ...

  8. 修正Android基于ZXing的二维码扫描——横竖屏自由切换

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

  9. Zxing 竖屏切换 android

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/aaawqqq/article/details/24804939 Zxing 竖屏切换  androi ...

  10. 金蝶云星空二维码整体解决方案 金蝶云星空条码管理系统 金蝶ERP移动解决方案 金蝶云星空条码扫描 金蝶云星空WMS仓库移动扫码 金蝶安卓PDA扫码方案 金蝶云星空出入库盘点出货条码扫码 提供源码

    本人在ERP实施公司做顾问四五年,参与企业实施ERP十多个项目,非常熟悉企业ERP流程,在实施过程遇到众多问题,提出了不少根据企业具体情况的解决方案.          最近定制开发了一套适合企业的条 ...

最新文章

  1. Dojo QuickStart 快速入门教程 (1) Why Dojo
  2. NOIP2018复赛 游记
  3. Tableau十三种图表应用场景及其组合图拓展
  4. 公司使用360安全产品造成的CRM系统故障!
  5. 利用canvas来绘制一个会动的图画
  6. php 关闭 row,MySql php:检查Row是否存在
  7. 思科模拟器叫什么_扫盲!通过型号快速识别思科路由器,交换机,服务器等设备...
  8. canvas放射粒子效果
  9. php正则表达式修饰符详解
  10. 二、jdk命令之javah命令(C Header and Stub File Generator)
  11. vfp语言属于第代计算机语言,计算机等级考试VFP教程:第二章VFP语言基础
  12. ArcGIS Desktop 打开崩溃,遇到严重的应用程序错误
  13. 2014年3月CCF软考试题
  14. 微信公众号网页 H5 video 标签自动播放
  15. igraph 牛刀小试
  16. skinsdog 狗网CSGO饰品皮肤开箱网站可取回的开箱网站
  17. python reverse方法和reversed方法的区别和使用
  18. 分布式认知工业互联网赋能工业企业数字化转型
  19. 硬件设计实战+PCB资料分享
  20. Adversarial Attack on Attackers: Post-Process to Mitigate Black-Box Score-Based Query Attacks

热门文章

  1. 100道接口测试面试题收好了!【建议收藏】
  2. 2021考研数学二汤家凤接力题典1800
  3. 28个python爬虫项目,你想要的爬虫知识都准备好了~~
  4. 使用nssm注册 windows服务
  5. linux中安装rpm命令,linux下,如何安装rpm命令?
  6. 华为od德科面试数据算法真题解析-专栏必看-
  7. 设计一个时间片轮转调度算法实现处理机调度的程序,具体内容如下
  8. matlab机器学习库
  9. 自媒体图文、视频素材网站哪里找?这些非常好用
  10. DGIOT实战教程——虚拟ModbusRTU接入