ZXing竖屏解决(完美版)

来源:互联网 发布:mac双色修容粉 编辑:程序博客网 时间:2024/04/27 23:12

好久没写博客了,正在做扫码的项目,我们调用ZXing的项目,毕竟有源码,比较好的深入哈。我用的是ZXing2.1的包,其实这个包也有问题,就是编码问题,请看ZXing乱码问题的解决!传送门(这个经测试还是有乱码问题,以后我会写一篇作为参考)

在之前一定要仔细看源码哦,这个项目有很多学习的地方呢。

好了,不多说了,正文,怎么解决竖屏问题,相信网上也能搜得到,可是那好多都是基于ZXing1.6版本的。

1、修改manifest文件,将CaptureActivity设为portrait

android:screenOrientation="portrait"

2、在DecodeHandler.java文件中,找到decode(byte[],int,int)方法,在buildLuminanceSource调用前,加上如下:

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、在CameraManager.java中找到getFramingRectInPreview()方法, 替换相应代码:

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;
4、在CameraConfigurationManager.java里找到setDesiredCameraParameters()方法,加入代码

camera.setDisplayOrientation(90);

到这里在ZXing1.6上已经可以完美的实现了,但是你用的是ZXing2.1的源码代码的话(我说的是ZXing2.1的例子项目),你会发现取景框会在屏幕的右上角,所以我们得把其拿到中间来。且看


5、在CameraConfigurationManager.java里找到initFromCameraParameters(Camera camera)方法,去掉如下代码

if (width < height) {Log.i(TAG, "Display reports portrait orientation; assuming this is incorrect");int temp = width;width = height;height = temp;}

到此就可以了,这样的话,可能你显示出来的大小不是你满意的,你可以修改CameraManager类中的如下代码:
private static final int MIN_FRAME_WIDTH = 240;  private static final int MIN_FRAME_HEIGHT = 240;  private static final int MAX_FRAME_WIDTH = 400;  private static final int MAX_FRAME_HEIGHT = 600;
你还可以根据像素进行数组选择最合适的宽高值,


对了,在打Log中遇到了了一个问题,在此提醒下大家

Unexpected error initializing cameraLog tag "CameraConfigurationManager" exceeds limit of 23 characters
LOG竟然还有23个字符的限制、报RuntimeException



原创粉丝点击