48

在阅读了一些关于该问题的问题和帖子后,我正在尝试旋转 Zxing 显示器。按照说明操作后,显示器确实旋转了,但扫描仪的矩形未按应有的位置定位(如所附图像所示)。

这就是我所做的:

  1. 在 CameraConfigurationManager 中:

    camera.setDisplayOrientation(90);
    
  2. 在解码处理程序.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

9 回答 9

30

经过一番挣扎,我发现了问题所在,我希望它对将来的人有所帮助。

initFromCameraParameters方法中CameraConfigurationManager有一个假设,即扫描是ALWAYS in landscape mode,因此修复时width < height。如果您按照问题中的步骤并删除此检查,则它可以正常工作。

于 2012-04-18T22:47:13.447 回答
16

从 zxing 库开始:2.2.0 对方向变化的支持是固有的

在清单中添加/编辑以下内容:

<activity
    android:name="com.journeyapps.barcodescanner.CaptureActivity"
    android:screenOrientation="fullSensor"
    tools:replace="screenOrientation" />

在调用扫描仪时设置附加属性:

IntentIntegrator integrator = new IntentIntegrator(this);

//allows portrait/landscape mode
integrator.setOrientationLocked(false);//"additional property"
integrator.initiateScan();

参考链接:https ://github.com/journeyapps/zxing-android-embedded#chang-the-orientation

于 2017-05-31T12:24:50.333 回答
14

谢谢您的回答!!它真的对我有帮助,我注意到的一件事是,至少在 zxing 2.1 上,您需要将“rotatedData”传递给 buildLuminanceSource 而不仅仅是“data”,该行最终如下所示:

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

希望这对其他人有帮助!

于 2013-01-25T19:37:25.377 回答
8

好吧,我在 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> 
于 2012-11-16T23:27:16.293 回答
5
  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"为。CaptureActivity

于 2014-10-11T05:26:48.367 回答
4

我是条形码扫描仪的开发人员。是的,要让它以纵向模式扫描,需要的远不止这些。您必须“旋转”图像数据,并考虑设备的方向、默认方向和传感器方向。

Barcode Scanner+以纵向模式扫描,您可以通过 Intent 与它集成,其方式与与 Barcode Scanner 集成的方式完全相同。(但它是一个付费应用程序。)

于 2012-04-18T20:23:14.547 回答
1

我尝试了其他答案中建议的各种补丁,但条形码识别仍然不可靠。

我强烈建议在纵向模式下使用下面的存储库。试试吧,它又快又稳定。我在我的混合应用程序中使用了它。

https://github.com/Dbuggerx/BarcodeScanner

于 2016-01-30T05:51:34.237 回答
1

试试这个:添加 android:screenOrientation="sensorPortrait"

<activity android:name=".CaptureActivity"
              android:screenOrientation="sensorPortrait"
              android:clearTaskOnLaunch="true"
              android:stateNotNeeded="true"
              android:theme="@style/CaptureTheme"
              android:windowSoftInputMode="stateAlwaysHidden"
于 2018-11-14T17:04:28.113 回答
0

在您的库中转到清单文件,更改活动标记下的以下行

android:screenOrientation="portrait"
于 2018-08-12T07:42:02.000 回答