Android Zxingスキャンバーコード縦画面モードカメラcamera 90度回転
最近バーコードスキャンに関するソフトウェアを作っていますが、スキャンが必要なときは縦画面です.最後に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
フラットパネルビュー
印刷?
3, CameraManager.java, getFramingRectInPreview() need to be modified.
フラットパネルビュー
印刷?
4, CameraConfigurationManager.java, set camera orientation to portrait in setDesiredCameraParameters() use
フラットパネルビュー
印刷?
注:バージョン互換性は以下を参照してください.and in getCameraResolution(), you need to swap x and y, because camera preview size is something like 480*320, other than 320*480.
フラットパネルビュー
印刷?
説明:カメラが90度回転する場合、sdkバージョンによって方法が異なります.互換性の方法は次のとおりです(ファイル:CameraConfigurationmanager.java)
フラットパネルビュー
印刷?
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) >= <IMG
class
=wp-smiley alt=
8
) src=
"http://www.andcoder.com/wp-includes/images/smilies/icon_cool.gif"
>
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
}