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

写在前面的话

感谢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。

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

zxing如何竖屏扫描

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

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

<activity android:name=".CaptureActivity"
              android:screenOrientation="portrait"
              android:clearTaskOnLaunch="true"
              android:stateNotNeeded="true"
              android:theme="@style/CaptureTheme"
              android:windowSoftInputMode="stateAlwaysHidden">

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

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

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

if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    } else {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }

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

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

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

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

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

//      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)方法:

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;
    width = height;
    height = tmp;
    data = rotatedData;

结束语

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

IllegalStateException("Parameters contained no preview size!");

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

好了,经过以上六步,zxing条码扫描器已经可以正常竖屏扫描了,剩下的工作就是精简代码了,祝大家顺利完成项目。

转载请注明作者xiong_it和原文出处:http://blog.csdn.net/xiong_it/article/details/46983293,谢谢!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 03:40:36

Android开发:ZXing条码扫描-竖屏解决方案的相关文章

(转)Android强制设置横屏或竖屏

全屏 在Activity的onCreate方法中的setContentView(myview)调用之前添加下面代码 requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏 横屏 按照下面代码示例修改Activity的o

cocos2d-x3.1.1中android中设置横屏和竖屏

在项目中的proj.android的AndroidManifest.xml文件中,修改一下信息就ok了,比较简单!!! screenOrientation="landscape" 为横屏, screenOrientation="portrait"为竖屏

(转载)[Android开发]zxing扫描结果乱码

ZXing扫描二维码出现中文乱码的问题最近项目的功能需要用到扫描二维码.就参考了google的开源项目ZXing..功能完成后..发现扫条形码没有问题..但是扫描二维码的时候却有一部分是乱码..或者不是中文的问题..于网上参考了很资料.但效果还是不太理想..后来发现只要以ISO-8859-1的格式来编码,取出结果再进行相应的转换..问题就解决了.并不需要修改源码:以下是修改的方法 第一:先在CaptureActivity类中设置它的默认编码 [java] view plaincopydecode

mui开发:苹果手机自动全屏解决方案

前一段时间,使用mui写app时,出现了苹果手机播放视频时,自动全屏的情况,并且无法点击控件,只能等到播放完毕后点击控件. 那么怎么解决这个问题呢,弟弟们请看我的下面. 1.在页面的video标签中,添加 playsinline webkit-playsinline x5-playsinline 属性 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <me

移动端竖屏解决方案

为大家提供一个H5页面手机横屏解决方案,这个是我朋友给我的,特别好用:https://pan.baidu.com/s/1eVZf6frKNnZylkft-OaFPA 当手机横屏的时候会出现: 因为不管使用监听旋转角度还是监听长宽比进行页面旋转,都会受到兼容性和可操作性的一些限制.这个方案也是用页面的宽高比来确定是否横屏,如有BUG,请自行修复... 哈哈哈,不要方,暂时还没发现无法兼容的机型,如果觉得样式不友好,可以写css改样式. 原文地址:https://www.cnblogs.com/ov

Android 强制设置横屏或竖屏 设置全屏

(转自:http://blog.csdn.net/yuejingjiahong/article/details/6636981) 强制横屏: 1 @Override 2 protected void onResume() { 3 /** 4 * 设置为横屏 5 */ 6 if(getRequestedOrientation()!=ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){ 7 setRequestedOrientation(ActivityInfo.S

android开发修改相机扫描二维码框的高宽

我用的是网上一个现成的例子,可以直接用,但是高宽不合适,现在主流都是大屏幕手机了,所以需要更改. 找到CameraManager 类,更改下面的方法 public Rect getFramingRect() { Point screenResolution = configManager.getScreenResolution(); if (framingRect == null) { if (camera == null) { return null; } int width = screen

Zxing二维码精简(竖屏、拉伸处理、扫描框大小和扫描线移动)

本帖最后由 levil_ad 于 2013-12-30 13:55 编辑 最近没事做了下二维码扫描,用的是ZXing的开源代码,官方源码地址:http://code.google.com/p/zxing/downloads/list:我是在ZXing2.2基础上做的,因此只下载了ZXing-2.2.zip:此外还需要ZXing的核心Jar包,下载地址:http://repo1.maven.org/maven2/com/google/zxing/core/2.2/,只需下载core-2.2.jar

Android之横屏竖屏显示问题

1.采用不同的布局文件 res文件下 选中layout  Ctrl+C 选中res Ctrl +V 创建layout-land横屏显示的layout 同理创建layout-port竖屏显示的layout 图片横屏竖屏 选中drawable-xhdpi Ctrl+C 选中res Ctrl + V 创建drawable-land-xhdpi 其他分辨率的也一样 字符串 values-land values-port 另外:(layout文件夹也可以使用hdip,mdip等关键字命名如layout-h