如何在纵向模式下使用Zxing?

时间:2011-11-04 09:31:18

标签: android

目前zxing库仅支持横向模式。对于我的应用程序,我需要在纵向模式下使用

9 个答案:

答案 0 :(得分:21)

以下是纵向模式扫描的解决方案

首先在你的app level gradle文件中声明这两行

implementation 'com.journeyapps:zxing-android-embedded:3.0.1@aar'
implementation 'com.google.zxing:core:3.2.0'

在xml文件和Onclick Listener中定义一个按钮,在MainActivity java文件中的代码下面写下

IntentIntegrator integrator = new IntentIntegrator(this);
    integrator.setPrompt("Scan a barcode");
    integrator.setCameraId(0);  // Use a specific camera of the device
    integrator.setOrientationLocked(true);
    integrator.setBeepEnabled(true);
    integrator.setCaptureActivity(CaptureActivityPortrait.class);
    integrator.initiateScan();

在onCreate()方法之后在MainActivity java文件中编写以下代码

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if(result != null) {
    if(result.getContents() == null) {
        Log.d("MainActivity", "Cancelled scan");
        Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();
    } else {
        Log.d("MainActivity", "Scanned");
        st_scanned_result = result.getContents();
        Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();

    }
  }

}

然后创建一个名为CaptureActivityPortrait的类,它扩展了CaptureActivity。该课程如下所示

  package soAndSo(Your PackageName);

  import com.journeyapps.barcodescanner.CaptureActivity;

  public class CaptureActivityPortrait extends CaptureActivity {
  }

最重要的是在清单文件中声明您的CaptureActivityPortrait,如下所示

<activity android:name=".CaptureActivityPortrait"
        android:screenOrientation="portrait"
        android:stateNotNeeded="true"
        android:theme="@style/zxing_CaptureTheme"
        android:windowSoftInputMode="stateAlwaysHidden"></activity>

答案 1 :(得分:16)

只需查看纵向模式下使用Zxing的问题。

答案 2 :(得分:5)

setDisplayOrientation(int)不会影响PreviewCallback.onPreviewFrame中传递的字节数组的顺序。 (有关其他信息,请参阅JavaDoc)

这意味着您需要从previewCallback旋转数据返回,但这是yuv数据,您需要转换为rgb数据然后旋转它们。可以在纵向模式下扫描条形码,但这需要更长的时间,因为它需要更多的时间来处理从yuv到rgb的数据并旋转rgb数据。 所以这里的问题是如何从portraitcallback获取yuv数据用于纵向模式?当我们为摄像机参数设置setPreviewSize时,如果不支持previewsize,它将获得异常。这是这个问题的问题。如果相机驱动程序不支持纵向模式的previewSize(高度>宽度),则无法以纵向模式获取yuv数据。其余的取决于您,您可以在纵向模式下扫描条形码,但需要更长的时间,或者您必须将屏幕的方向更改为横向以更快地获得结果。

答案 3 :(得分:5)

请检查以下各项(Official Documentation

将此活动添加到清单文件

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

将积分器OrientationLocked设置为false

IntentIntegrator integrator = new IntentIntegrator(this);
integrator.setOrientationLocked(false);
integrator.initiateScan();

希望这会有所帮助

答案 4 :(得分:3)

只需在项目的AndroidManifest.xml中添加这些代码

即可
<activity android:name="com.journeyapps.barcodescanner.CaptureActivity"
        android:screenOrientation="sensorPortrait"
        android:stateNotNeeded="true"
        android:theme="@style/zxing_CaptureTheme"
        android:windowSoftInputMode="stateAlwaysHidden"
        tools:replace="android:screenOrientation" />

答案 5 :(得分:3)

我想在纵向模式下使用条形码阅读器。我发现了solution here 如本主题前面的评论中所述。我以为这是一个答案,因此更容易为遇到相同问题的人找到解决方案。

要以纵向模式使用扫描仪,您需要在AndroidManifest.xml中添加以下活动。

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

就是这样。

有关更多详细信息,请参见链接。

答案 6 :(得分:2)

  1. 为了使画面以纵向方式工作,请为活动设置纵向(例如在清单中),然后配置相机:在CameraConfigurationManager.setDesiredCameraParameters(相机相机)中使用camera.setDisplayOrientation(90)。但请注意:

    • setDisplayOrientation(int)需要Android 2.2
    • setDisplayOrientation(int)不影响在PreviewCallback.onPreviewFrame中传递的字节数组的顺序。 (有关其他信息,请参阅JavaDoc)
  2. 由于预览帧始终处于“横向”状态,因此我们需要旋转它们。我使用comment #11提供的顺时针旋转。旋转后不要忘记交换宽度和高度参数。 DecodeHandler.java,在decode(build []数据,int width,int height)中的buildLuminanceSource之前旋转数据

    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; // Here we are swapping, that's the difference to #11
    width = height;
    height = tmp;
    
  3. 我还按照#c11的建议修改了CameraManager.java,getFramingRectInPreview():

    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. 我没有修改getCameraResolution()。这是#c11的第二个区别。

  5. 结果,我有UPC和其他一维代码扫描工作的肖像。

    P.S。您也可以调整FramingRect的大小(这是扫描期间屏幕上可见的矩形),FramingRectInPreview将自动调整。

答案 7 :(得分:2)

使用此安卓库https://github.com/SudarAbisheck/ZXing-Orient

它支持纵向和横向。

答案 8 :(得分:0)

将此android:screenOrientation =“ sensorPortrait”添加到清单中

<activity android:name=".CaptureActivity"
              android:screenOrientation="sensorPortrait"
              android:clearTaskOnLaunch="true"
              android:stateNotNeeded="true"
              android:theme="@style/CaptureTheme"
              android:windowSoftInputMode="stateAlwaysHidden"
tools:replace="android:theme"/>