Android开发:ZXing条码扫描-竖屏解决方案

转载 2016年05月31日 16:48:22

写在前面的话

感谢ZXing团队,项目下载地址:https://github.com/zxing/zxing,项目下载后,Android条码扫描主要用到三个模块:android,android-core,core。zxing项目解压后目录结构如图所示:
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。
友情提示:本文提供解决方案,类库源码不进行任何修改,以下提到的修改部分均为客户端源码。


zxing如何竖屏扫描

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

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

[html] view plain copy
  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">  


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

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

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

[java] view plain copy
  1. if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {  
  2.         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);  
  3.     } else {  
  4.         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  
  5.     }  
经过前三步,条码扫描器已经竖屏了,相信很多人也改到这里就出现问题了,zxing条码扫描器相机预览方向旋转了90度,并且容易拉伸,我们需要纠正相机预览方向。


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

[java] view plain copy
  1. camera.setDisplayOrientation(90);//add 这句代码作用是旋转镜头90度,使相机预览方向正确显示  
  2. camera.setParameters(parameters);  
相机预览正常了,也没有拉伸,可是二维码识别却慢了许多,并且一维条码识别不出来,需要横屏扫描才可以识别,而且条码成像仍然是横向的,下面步骤将解决这个问题。


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

[java] view plain copy
  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.   
  6.         rect.left = rect.left * cameraResolution.y / screenResolution.x;  
  7.         rect.right = rect.right * cameraResolution.y / screenResolution.x;  
  8.         rect.top = rect.top * cameraResolution.x / screenResolution.y;  
  9.         rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;  

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

[java] view plain copy
  1. PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(data, width, height);  
前添加代码

[java] view plain copy
  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;  


结束语

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

[plain] view plain copy
  1. IllegalStateException("Parameters contained no preview size!");  
如果只进行了第六步,而没有第五步,则无法正常识别条码。

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

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

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

Google ZXing系列讲解(四)——ZXing 解决竖屏扫描问题

前言本篇文章带你了解 - ZXing Android Demo竖屏后无法实现扫描原因 - ZXing 横竖屏下扫描条码/二维码ZXing横竖屏扫描默认的ZXing Demo提供的是横屏扫描,讲真,...

图书api 查询图书内容

于万千之中选择你所爱--好书推荐,值得你信赖。图书api可查询图书内容,包括书名、书名简介、图书内容简介、图书封面、阅读人数、网购地址、发布时间等等。 接口名称:图书api 接口平台:开放接口 ...

PHP array_filter函数的一点应用 获取二维数组中指的键值的结果

array array_filter ( array [, callback callback] )  array_filter() 依次将 array 数组中的每个值传递到 callback ...
  • Dearlv
  • Dearlv
  • 2014年03月09日 22:11
  • 3547

Android开发:ZXing条码扫描-竖屏解决方案

本文提供的zxing竖屏扫描解决方案采用的android版本号versionName为4.7.4,versionCode为104,zxing类库版本号为3.2.0,理论上4.7.x通用。zxing默认...

ZXing条码扫描----竖屏解决方案

写在前面的话 感谢ZXing团队,项目下载地址:https://github.com/zxing/zxing,项目下载后,Android条码扫描主要用到三个模块:android,android-cor...

ZXing条码扫描-竖屏解决方案

原博地址:http://www.open-open.com/lib/view/open1437533499553.html zxing如何竖屏扫描 将zxing源码android导入Ecl...

Android Zxing 扫描条码实现竖屏模式(portrait mode) 摄像头camera 旋转90度

最近在搞一个关于条形码扫描的软件,需求需要扫描时是竖屏。 最后在zxing官方wiki上面找到解决办法。基本思路如下。 There are 4 relative files: 1, manife...

Android Zxing 扫描条码实现竖屏模式 Camera摄像头 旋转90度

该文章转自网络 关于条形码扫描的软件,做软件需求时需要扫描时竖屏:        android提供的SDK(android.hardware.Camera)里大概不能正常的使用竖屏(portra...
  • lylzwsy
  • lylzwsy
  • 2013年09月18日 10:17
  • 3158
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android开发:ZXing条码扫描-竖屏解决方案
举报原因:
原因补充:

(最多只允许输入30个字)