この問題に関するいくつかの質問と投稿を読んだ後、Zxingディスプレイを回転させようとしています。指示に従った後、ディスプレイは回転しましたが、スキャナーの長方形は本来の位置に配置されていません(添付の画像に見られるように)。
これは私がやったことです:
cameraConfigurationManagerで:
camera.setDisplayOrientation(90);
decodeHandler.Javaで
byte[] rotatedData = new byte[data.length];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++)
rotatedData[x * height + height - y - 1] = data[x + y * width];
}
int tmp = width;
width = height;
height = tmp;
cameraManager.Javaで:
rect.left = rect.left * cameraResolution.y / screenResolution.x;
rect.right = rect.right * cameraResolution.y / screenResolution.x;
rect.top = rect.top * cameraResolution.x / screenResolution.y;
rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;
多くの苦労の後、私は問題を見つけました、そして、それが将来誰かに役立つことを望みます。
initFromCameraParameters
のCameraConfigurationManager
メソッドでは、スキャンがALWAYS in landscape mode
、したがってwidth < height
。質問の手順に従ってこのチェックを削除すると、正常に機能します。
ご回答ありがとうございます!!それは本当に助けになりました、私が気づいた1つのことは、少なくともzxing 2.1では、「data」の代わりに「rotatedData」をbuildLuminanceSourceに渡す必要があることです。行は次のようになります:
PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(rotatedData, width, height);
うまくいけば、これは他の誰かを助けます!
zxingライブラリの場合:2.2.0の方向変更のサポートは固有です
マニフェストで次を追加/編集します。
<activity
Android:name="com.journeyapps.barcodescanner.CaptureActivity"
Android:screenOrientation="fullSensor"
tools:replace="screenOrientation" />
Scannerの呼び出し時に追加のプロパティを設定します。
IntentIntegrator integrator = new IntentIntegrator(this);
//allows portrait/landscape mode
integrator.setOrientationLocked(false);//"additional property"
integrator.initiateScan();
参照リンク: https://github.com/journeyapps/zxing-Android-embedded#changing-the-orientation
さて、ProjectLibrary(xzingプロジェクト)に小さな変更を加え、向きを横向きから縦向きに変更できるようになりました
_setDesiredCameraParameters method of class CameraConfigurationManager
_に追加
camera.setDisplayOrientation(90);
..私の元のプロジェクトの_AndroidManifest.xml
_ファイル。 _screenOrientation = portrait
_を設定し、そのICS 4.0.3
_ <activity
Android:name="com.google.zxing.client.Android.CaptureActivity"
Android:configChanges="orientation|keyboardHidden"
Android:exported="false"
Android:screenOrientation="portrait"
Android:theme="@Android:style/Theme.NoTitleBar.Fullscreen"
Android:windowSoftInputMode="stateAlwaysHidden" >
<intent-filter>
<action Android:name="com.phonegap.plugins.barcodescanner.SCAN" />
<category Android:name="Android.intent.category.DEFAULT" />
</intent-filter>
</activity>
_
CameraConfigurationManager
で:
camera.setDisplayOrientation(90);
DecodeHandler.Java
:
byte[] rotatedData = new byte[data.length];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++)
rotatedData[x * height + height - y - 1] = data[x + y * width];
}
int tmp = width;
width = height;
height = tmp;
CameraManager.Java
:
rect.left = rect.left * cameraResolution.y / screenResolution.x;
rect.right = rect.right * cameraResolution.y / screenResolution.x;
rect.top = rect.top * cameraResolution.x / screenResolution.y;
rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;
CameraConfigurationManager
で:
if (width > height) {
Log.i(TAG, "Display reports portrait orientation; assuming this is incorrect");
int temp = width;
width = height;
height = temp;
}
変化する Android:screenOrientation="portrait"
forマニフェストのCaptureActivity
.
私はバーコードスキャナーの開発者です。はい、ポートレートモードでスキャンするには、これ以上のことが必要です。画像データを「回転」させ、デバイスの向き、デフォルトの向き、センサーの向きを考慮する必要があります。
バーコードスキャナー+ ポートレートモードでスキャンします。Intentを介して、 バーコードスキャナーと統合 とまったく同じ方法で統合できます。 (ただし、有料アプリです。)
これを試してください:Android:screenOrientation="sensorPortrait"
を追加します
<activity Android:name=".CaptureActivity"
Android:screenOrientation="sensorPortrait"
Android:clearTaskOnLaunch="true"
Android:stateNotNeeded="true"
Android:theme="@style/CaptureTheme"
Android:windowSoftInputMode="stateAlwaysHidden"
他の回答で提案されているさまざまなパッチを試しましたが、バーコードの認識は信頼できませんでした。
下のリポジトリをポートレートモードで使用することを強くお勧めします。試してみてください、高速で安定しています。ハイブリッドアプリで使用しました。
ライブラリでマニフェストファイルに移動し、アクティビティタグの下の以下の行を変更します
Android:screenOrientation="portrait"