

因为该项目使用了QR码扫描功能,所以我在学校时听说老师说ZXing. 第一个反应是找到ZXing. 在网上搜索后,我发现ZXing是Google开源的,它仍然是相对主流的. 所以我下载了一个包. 其中我所关心的是android. 导入官方程序包并运行它. 这真的很酷. . . 为什么是横屏!!!所以我开始踩坑.
我下载了最新的官方3.2.1版本. 首先,我搜索了如何更改为垂直屏幕(搜索相关内容很容易). 进行更改后,这似乎很简单. 完成起来容易吗?当时我使用2 1920 * 1080分辨率android zxing 官网,没有问题.
当我在480 * 800和1280 * 720分辨率的手机之间切换时遇到问题. 当然,这不是那么简单和漫不经心!
查看源代码,其中在ViewfinderView的onDraw()中实现相框的绘制,onDraw中的第一个方法是
矩形框= cameraManager.getFramingRect();通过这句话,我知道是通过CameraManager

getFramingRect方法获取大小. 我们进入CameraManager并像这样重写它
//int width = findDesiredDimensionInRange(screenResolution.x, MIN_FRAME_WIDTH, MAX_FRAME_WIDTH);
//int height = findDesiredDimensionInRange(screenResolution.y, MIN_FRAME_HEIGHT, MAX_FRAME_HEIGHT);
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
int width = (int) (metrics.widthPixels * 0.6);
int height = width;
被注释的部分是原始实现. 我说过,高度和宽度更改为屏幕宽度的0.6倍. 目前,它已经是正常的正方形.
解决方案位于CameraConfigurationManager的initFromCameraParameters方法中
Log.i(TAG,“当前方向的屏幕分辨率: ” + screenResolution);
Point screenResolutionForCamera = new Point();
screenResolutionForCamera.x = screenResolution.x;
screenResolutionForCamera.y = screenResolution.y;
// preview size is always something like 480*320, other 320*480
if (screenResolution.x < screenResolution.y) {
screenResolutionForCamera.x = screenResolution.y;
screenResolutionForCamera.y = screenResolution.x;
}

和
cameraResolution = CameraConfigurationUtils.findBestPreviewSizeValue(参数,screenResolution);
更改为
cameraResolution = CameraConfigurationUtils.findBestPreviewSizeValue(参数,screenResolutionForCamera);
这时,我仍在运行. 查看之前的源代码,它与现在的代码有些不同. 互联网的基本知识是2.x.
在3.2.1中

bestPreviewSize = CameraConfigurationUtils.findBestPreviewSizeValue(参数android zxing 官网,screenResolution);
更改
bestPreviewSize = CameraConfigurationUtils.findBestPreviewSizeValue(参数,screenResolutionForCamera);
再次运行程序,发现图像不再被拉起.
就在我以为一切都结束了的时候. 我发现扫描几乎无法识别. 稍后检查后,我发现原因已更改为垂直屏幕.
1. 在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;
注释是原始代码,后跟更改后的代码.
2. 在DecodeHandler PlanarYUVLuminanceSource source = activity.getCameraManager()中解码(字节[]数据,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;
width = height;
height = tmp;
data = rotatedData;
我已经解决了之前遇到的问题.
其中,如果仅更改第一步而不更改第二步,则会出现错误
只有第二步而不是第一步将无法识别QR码
您只需要在ViewfinderView中绘制onDraw方法即可. 该方法也非常简单,将不再介绍. 不要忘了进行调整,您可以将自定义属性更改为xml配置,并通过调暗来调整不同的分辨率.
1.png
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shouji/article-149314-1.html
既然同性如此重口的事都能想到去合法化了