web-dev-qa-db-ja.com

Android Zxingは向きを縦に変更します

この問題に関するいくつかの質問と投稿を読んだ後、Zxingディスプレイを回転させようとしています。指示に従った後、ディスプレイは回転しましたが、スキャナーの長方形は本来の位置に配置されていません(添付の画像に見られるように)。

これは私がやったことです:

  1. cameraConfigurationManagerで:

    camera.setDisplayOrientation(90);
    
  2. 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;
    
  3. 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;
    

enter image description here

44
Udi Idan

多くの苦労の後、私は問題を見つけました、そして、それが将来誰かに役立つことを望みます。

initFromCameraParametersCameraConfigurationManagerメソッドでは、スキャンがALWAYS in landscape mode、したがってwidth < height。質問の手順に従ってこのチェックを削除すると、正常に機能します。

30
Udi Idan

ご回答ありがとうございます!!それは本当に助けになりました、私が気づいた1つのことは、少なくともzxing 2.1では、「data」の代わりに「rotatedData」をbuildLuminanceSourceに渡す必要があることです。行は次のようになります:

PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(rotatedData, width, height);

うまくいけば、これは他の誰かを助けます!

14
Roberto

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

8
Anup

さて、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> 
_
8
Yousuf Qureshi
  1. CameraConfigurationManagerで:

    camera.setDisplayOrientation(90);
    
  2. 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;
    
  3. 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;
    
  4. CameraConfigurationManagerで:

    if    (width > height) {
      Log.i(TAG, "Display reports portrait orientation; assuming this is incorrect");
      int temp = width;
      width = height;
      height = temp;
    }
    
  5. 変化する Android:screenOrientation="portrait" forマニフェストのCaptureActivity.

5

私はバーコードスキャナーの開発者です。はい、ポートレートモードでスキャンするには、これ以上のことが必要です。画像データを「回転」させ、デバイスの向き、デフォルトの向き、センサーの向きを考慮する必要があります。

バーコードスキャナー+ ポートレートモードでスキャンします。Intentを介して、 バーコードスキャナーと統合 とまったく同じ方法で統合できます。 (ただし、有料アプリです。)

4
Sean Owen

これを試してください:Android:screenOrientation="sensorPortrait"を追加します

<activity Android:name=".CaptureActivity"
              Android:screenOrientation="sensorPortrait"
              Android:clearTaskOnLaunch="true"
              Android:stateNotNeeded="true"
              Android:theme="@style/CaptureTheme"
              Android:windowSoftInputMode="stateAlwaysHidden"
1
rizujikeda

他の回答で提案されているさまざまなパッチを試しましたが、バーコードの認識は信頼できませんでした。

下のリポジトリをポートレートモードで使用することを強くお勧めします。試してみてください、高速で安定しています。ハイブリッドアプリで使用しました。

https://github.com/Dbuggerx/BarcodeScanner

1
Loi Nguyen

ライブラリでマニフェストファイルに移動し、アクティビティタグの下の以下の行を変更します

Android:screenOrientation="portrait"
0