Android 条形码、二维码扫描开发总结

时间:2022-09-05 12:02:54

     我这里主要是以扫描二维码窗口大小为例总结的一点见解,可能很片面,但是先记录着,以后也可更改。

    写扫描二维码的程序主要是根据Zxing源码修改相应的代码来得到适合自己的程序。我用来修改的代码也是网上大神简化的源码得来的。主要修改的地方有:

1、CaptureActivity类里面handleDecode(Result obj,Bitmap bitmap)方法,这个方法是用来处理扫描结果的,一般有两个数据,一个字符串信息,一个bitmap图片信息。

2、一般源码上的扫描框是满足不了客户的,所以第二个修改的类是ViewfinderView,

重写view.onDraw()方法。在里面重新画图,paint,bitmap,canvas等都要用到。

3、本来这样也算改好了,运行后发现,那个扫描框好小,但在另一款手机上又刚好,看了下源码,设计扫描框大小的是CameraManager类。它用的是Point screenResolution = configManager.getScreenResolution();来获取屏幕分辨率的。

宽度:int width = screenResolution.x*3/4(屏幕宽度的3/4)

高度:int height = screenResolution.y*3/4(屏幕高度的3/4)

按这样算,应该是不会小的,关键是它后面有个限定扫描框的最大最小值。

int maxWidth = 480;

int maxHeight = 320;

这个大小对于高分辨率的手机来说就很小了。所以个人觉得还是把最大值去掉,就按屏幕大小的百分比来设定扫描框的大小。但我不清楚源码这样设定一个最大值具体作用是什么。

4、现在又有个问题,这个源码默认是横屏扫描的,我们要设置为竖屏的,这就又要改源码了。

1)、在CameraConfigurationManager类setDesiredCameraParameters(Camera camera)方法里添加camera.setDisplayOrientation(90);

2)、在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;

3)、在DecodeHandler类里decode()方法里将PlanarYUVLuminanceSource source = CameraManager.get().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;
    PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(rotatedData, width, height);

最后别忘了AndroidManifest文件里属性android:screenOrientation="portrait"


我是Android 新手,上面这些都是网上各种找出来结合自己写的整合了下,给初学者做个参考。