Android Zxing二维码扫描图片拉伸、扫描框过小、扫描框扩大后(或不拉伸后)闪退问题

(一)Zxing二维码扫描框大小调整


控制扫描框大小代码是在CameraManager类中

google在CameraManager类中设置扫描框大小主要在getFramingRect()中:

  private static final int MIN_FRAME_WIDTH = 240;
  private static final int MIN_FRAME_HEIGHT = 240;
  private static final int MAX_FRAME_WIDTH = 480;
  private static final int MAX_FRAME_HEIGHT = 360;
  
public Rect getFramingRect() {
    Point screenResolution = configManager.getScreenResolution();
    if (framingRect == null) {
      if (camera == null) {
        return null;
      }
    int width = screenResolution.x * 3 / 4;
      if (width < MIN_FRAME_WIDTH) {
        width = MIN_FRAME_WIDTH;
      } else if (width > MAX_FRAME_WIDTH) {
        width = MAX_FRAME_WIDTH;
      }
      int height = screenResolution.y * 3 / 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) / 2;

      framingRect = new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height);
      Log.d(TAG, "Calculated framing rect: " + framingRect);
    }
    return framingRect;
  }



我们修改 getFramingRect()这个方法,不再使用默认的固定大小,而是根据实际设备的屏幕大小设定

 public Rect getFramingRect() {
    Point screenResolution = configManager.getScreenResolution();
    if (framingRect == null) {
      if (camera == null) {
        return null;
      }
     DisplayMetrics metrics = context.getResources().getDisplayMetrics();
     int width = (int)(metrics.widthPixels * 0.6);
     int height = (int)(width * 0.9); 
     int leftOffset = (screenResolution.x - width) / 2;
     int topOffset = (screenResolution.y - height) / 2;
      framingRect = new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height);
      Log.d(TAG, "Calculated framing rect: " + framingRect);
    }
    return framingRect;
  }


 
 

以上方式可以实现扫描框扩大,但是部分机型会出现,扫描后闪退现象,原因是在 MipcaActivityCapture的handleDecode中向bundle中添加的bitmap过大,代码是bundle.putParcelable("bitmap", barcode);  handleDecode是用来处理扫描结果的,例如向调用MipcaActivityCapture的Activity回传扫描结果和扫描得到的bitmap。但bitmap不能过大超出内存限制就会奔溃。

解决的办法:如果不需要显示扫描得到的图片,我们可以不将bitmap导入bundle,直接将bundle.putParcelable("bitmap", barcode)注释掉。

                     如果一定要获得bitmap,则需要在导入前将bitmap压缩

(二)Zxing是google提供的二维码扫描工程

扫描框默认是横屏的转换成竖屏后图片会出现拉伸现象

解决的办法:

Zxing  修改 CameraConfigurationManager.Java文件的

void initFromCameraParameters(Camera camera)方法,在 Log.d(TAG, "Screen resolution: " + 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 = getCameraResolution(parameters, screenResolution); 
修改为
cameraResolution = getCameraResolution(parameters, screenResolutionForCamera);  
经过如上操作后基本可以解决,图片拉伸的问题,但是部分机型会出现,扫描后闪退现象,原因和扩大扫描框后出现闪退的原因类似,基本是bitmap过大的原因。








  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值