Android下ZXing扫描框尺寸调整和闪退处理
Android下ZXing扫描框尺寸调整和闪退处理
屋顶牛奶 发表于2年前
Android下ZXing扫描框尺寸调整和闪退处理
  • 发表于 2年前
  • 阅读 26
  • 收藏 0
  • 点赞 2
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

条码扫描功能加入之后,发现条码款略小,离条码近了扫不全,离条码远了又识别不了,于是我开始寻找放大扫描框的方法,并实现了百度一下找到了两种方法,都是通过修改CameraManager文件,两种方法都可以实现条码框方法,但却在扫描返回时,直接退出到前一个Activity了,而并没有返回到startActivityForResult的这个activity,然而logcat却没有给出任何错误信息。

关于两种方法:

第一种是修改四个静态变量,把这四个值分别调大,就可以放大扫描框

private static final int MIN_FRAME_WIDTH = 240; 
private static final int MIN_FRAME_HEIGHT = 240;
private static final int MAX_FRAME_WIDTH = 640;//修改之前是480 
private static final int MAX_FRAME_HEIGHT = 480;//修改之前是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;
  }

修改后的代码:

  public Rect getFramingRect() {
	    Point screenResolution = configManager.getScreenResolution();
	    if (framingRect == null) {
	      if (camera == null) {
	        return null;
	      }
	      //修改之后  
		  int width = screenResolution.x * 7 / 10;
		  int height = screenResolution.y * 4 / 10;
	      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;
	  }

用以上任何一个方法都可以实现扫描框尺寸调大

       

接下来我一直在寻找异常退出的原因,单步执行代码,在扫描结果处理函数结束后,程序没有正确返回:

仔细想了想原因,扫描返回时带有图片参数,扫描框增大后图片就会增大,我的程序并没有使用图片的返回值,因此直接注释掉图片信息放入Intent的代码,到此问题顺利解决了。

关于问题的思考,场景是这样的,Activity1→Activity2→MipcaActivityCapture,Activity2通过startActivityForResult启动了MipcaActivityCapture进行条码扫描,但是MipcaActivityCapture返回后却直接回到了Activity1。我觉得是扫描框增大后图片增大,将图片放入intent时申请了大量的内存,dalvik虚拟机内存分配不足时回收了处于OnStop状态的Activity2,于是当扫描的MipcaActivityCapture返回时,Activity2却已经被回收了,所以回到了Activity1。

那么一个新的问题出现了,为什么不回收Activity1,却把Activity2给回收了,这样startActivityForResult这种调用是不是并不可靠,是不是因为在Activity栈里,2在1的后面入栈?关于这些问题,我想我还需要继续寻找答案。

 

 

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 0
博文 4
码字总数 3357
×
屋顶牛奶
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: