最近在搞一个关于条形码扫描的软件,需求需要扫描时是竖屏。
最后在zxing官方wiki上面找到解决办法。基本思路如下。
There are 4 relative files:
1, manifest.xml, you need to make CaptureActivity portrait.
2, DecodeHandler.java, rotate data before buildLuminanceSource, it works becuase in YCbCr_420_SP and YCbCr_422_SP, the Y channel is planar and appears first
平板视图
打印 ?
1
byte[] rotatedData =new byte[data.length];
2
for (int y =0; y < height; y++) {
3
for (int x =0; x < width; x++)
4
rotatedData[x * height + height - y -1] = data[x + y * width];
5
}
3, CameraManager.java, getFramingRectInPreview() need to be modified.
平板视图
打印 ?
1
rect.left = rect.left * cameraResolution.y / screenResolution.x;
2
rect.right = rect.right * cameraResolution.y / screenResolution.x;
3
rect.top = rect.top * cameraResolution.x / screenResolution.y;
4
rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;
4, CameraConfigurationManager.java, set camera orientation to portrait in setDesiredCameraParameters() use
平板视图
打印 ?
1
parameters.set("orientation","portrait");
注:版本兼容请看下面。
and in getCameraResolution(), you need to swap x and y, because camera preview size is something like 480*320, other than 320*480.
平板视图
打印 ?
1
int tmp = cameraResolution.x;
2
cameraResolution.x = cameraResolution.y;
3
cameraResolution.y = tmp;
4
return cameraResolution;
说明:
关于摄像头旋转90度的时候,不同的sdk版本方法不同。
兼容方法如下
(所在文件:CameraConfigurationManager.java)
平板视图
打印 ?
01
if (Integer.parseInt(Build.VERSION.SDK) >=
02
setDisplayOrientation(camera,90);
03
else {
04
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
05
parameters.set("orientation","portrait");
06
parameters.set("rotation",90);
07
}
08
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
09
parameters.set("orientation","landscape");
10
parameters.set("rotation",90);
11
}
12
}
13
14
protected void setDisplayOrientation(Camera camera,int angle) {
15
Method downPolymorphic;
16
try {
17
downPolymorphic = camera.getClass().getMethod(
18
"setDisplayOrientation",new Class[] {int.class });
19
if (downPolymorphic !=null)
20
downPolymorphic.invoke(camera,new Object[] { angle });
21
} catch (Exception e1) {
22
}
23
}