zxing的各种设置问题。(引用其他nb人经验)

项目地址:  http://blog.csdn.net/xiaanming/article/details/10163203



1. 关于照相机拉伸拉长的问题解决:

Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果

这篇文章写的不错,但是按照这篇文章使用二维码的话会出现竖屏扫描图像拉伸变长的问题(有一个地方计算错误),解决拉伸变长的问题后又会出现闪退的问题(传输大Bitmap对象导致闪退,改为Byte数组或者不传递Bitmap)

其他地方不动,即可完美移植二维码扫描功能

改动一:

CameraConfigurationManager文件
findBestPreviewSizeValue方法下边这句
     	int newDiff = Math.abs(newX - screenResolution.x) + Math.abs(newY - screenResolution.y);
改为
	int newDiff=Math.abs(newY - screenResolution.x) + Math.abs(newX - screenResolution.y);
原文那样计算是因为计算的是横屏扫描的分辨率

这样改动后发现扫描不拉伸了,但是没有扫描结果,扫描结果返回的界面一闪而退,是因为Activity之间传递了大的Bitmap

改动二:

 
 
MipcaActivityCapture文件
handleDecode方法中将Bitmap转为Byte数组然后再在Activity之间传递或者不传递Bitmap
         Intent resultIntent = new Intent();
         Bundle bundle = new Bundle();
         bundle.putString("result", resultString);
//       bundle.putParcelable("bitmap", barcode);
//       ByteArrayOutputStream baos=new ByteArrayOutputStream();
//       barcode.compress(Bitmap.CompressFormat.PNG, 100, baos);
//       byte [] bitmapByte =baos.toByteArray();
//       bundle.putByteArray("bitmap",bitmapByte);
         resultIntent.putExtras(bundle);
         this.setResult(RESULT_OK, resultIntent);
经过这两处改动,就可以完美使用二维码了
原文还有个问题就是扫描二维码的区域有点小,需要离被扫描的二维码很远才能被扫描
 
 
 
 
2.关于相框取景小的问题的改动
 
 

在com.zxing.camera包中找到

//修改这里最小最大值,限制扫描框大小

 private static final int MIN_FRAME_WIDTH = 240;//240

  private static final int MIN_FRAME_HEIGHT = 240;//240

  private static final int MAX_FRAME_WIDTH = 480;//480

  private static final int MAX_FRAME_HEIGHT = 480;//360

CameraManager类的getFramingRect方法

public Rect getFramingRect() {

    Point screenResolution = configManager.getScreenResolution();

    if (framingRect == null) {

      if (camera == null) {

        return null;

      }

      int width = screenResolution.x * 2 / 3;//设定框框宽度大小

      if (width < MIN_FRAME_WIDTH) {

        width = MIN_FRAME_WIDTH;

      } else if (width > MAX_FRAME_WIDTH) {

        width = MAX_FRAME_WIDTH;

      }

      int height = screenResolution.y * 2/ 4;//设定框框高度大小

      if (height < MIN_FRAME_HEIGHT) {

        height = MIN_FRAME_HEIGHT;

      } else if (height > MAX_FRAME_HEIGHT) {

        height = MAX_FRAME_HEIGHT;

      }

      int leftOffset = (screenResolution.x - width) / 2;//设定框框离左边相对位置

      int topOffset = (screenResolution.y - height) / 5;//设定框框离顶部相对位置

      framingRect = new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height);

      Log.d(TAG, "Calculated framing rect: " + framingRect);

    }

    return framingRect;

  }

 
 

猜你喜欢

转载自blog.csdn.net/qqda6/article/details/78742194