今天在进行 zxing 二维码扫描时,出现 FAILED BINDER TRANSACTION,心里那叫一个不爽。
细看了下代码,因为之前写的扫描的代码,扫描框有些小,于是修改了zxing包下 camera 包下的 CameraManager 类的 getFramingRect 方法,原 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 (mCamera == null) {
return null;
}
int width = screenResolution.x * 3 / 4;
// int width = screenResolution.x * 4 / 5;
// if (width < MIN_FRAME_WIDTH) {
// width = MIN_FRAME_WIDTH;
// } else if (width > MAX_FRAME_WIDTH) {
// width = MAX_FRAME_WIDTH;
// }
int height = screenResolution.y * 44 / 99;
// 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 * 24 / 102;
framingRect = new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height);
Log.d(TAG, "Calculated framing rect: " + framingRect);
}
return framingRect;
}
结果看
public void handleDecode(Result result, Bitmap barcode) {
inactivityTimer.onActivity();
playBeepSoundAndVibrate();
// 在界面可见时闪光灯可以继续打开
// isOpen = false;
// contralLight();
String resultString = result.getText();
if (resultString.equals("")) {
Toast.makeText(ScanActivity.this, "无效二维码", Toast.LENGTH_SHORT).show();
} else {
Intent resultIntent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("result", resultString);
// bundle.putParcelable("bitmap", barcode);
resultIntent.putExtras(bundle);
this.setResult(RESULT_OK, resultIntent);
}
AppManager.getInstance().closeActivity(ScanActivity.this);
}
方法中返回的结果 : resultString 的值是有的,但程序卡在这个界面不能动,log里面显示:FAILED BINDER TRANSACTION,于是上网各种查,终于找到原因:
Android中使用Intent进行传递数据时出现:E/JavaBinder﹕ !!! FAILED BINDER TRANSACTION !!!错误信息,例如传递一个大的Bitmap对象时。
这种情况是因为系统对Intent传递数据有大小限制。
原来是我将预览框变大后,扫描获得的 bitmap 也就大了,在 intent' 传输的时候,受到大小的限制,于是出现 FAILED BINDER TRANSACTION,由于我调用扫描的时候不需要bitmap,所以我在传输的时候把 bundle.putParcelable("bitmap", barcode);注释掉了,大家如果需要传输 bitmap的话,记得在放入 intent之前,对 bitmap的大小做一下处理