条码扫描功能加入之后,发现条码款略小,离条码近了扫不全,离条码远了又识别不了,于是我开始寻找放大扫描框的方法,并实现了百度一下找到了两种方法,都是通过修改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;

}

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

4c919ac87316a383a4da1eac7c3ed42c.png       

03e42e3d128ecca8247e42f22a761e93.png

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

bf2dba04fb2b8b1f39f6e8bea2086732.png

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

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

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