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;
    

9 ответов

Решение

После долгих попыток я нашел проблему и надеюсь, что она поможет кому-то в будущем.

На initFromCameraParameters метод в CameraConfigurationManager есть предположение, что сканирование ALWAYS in landscape modeи для этого исправить, когда width < height, Если вы выполните действия, описанные в вопросе, и удалите эту проверку, она будет работать нормально.

Начиная с библиотеки 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

Спасибо за ваш ответ!! это действительно помогло мне, одну вещь, которую я заметил, это то, что по крайней мере на zxing 2.1 вам нужно передавать "rotatedData" в buildLuminanceSource вместо просто "data", строка в итоге выглядит так:

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

Надеюсь, это поможет кому-то еще!

Ну, я сделал небольшое изменение в 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> 
  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 в манифесте.

Я разработчик сканера штрих-кода. Да, для сканирования в портретном режиме требуется намного больше. Вы должны "вращать" данные изображения и учитывать ориентацию устройства, его ориентацию по умолчанию и ориентацию датчика.

Сканер штрих-кода + сканирует в портретном режиме, и вы можете интегрировать его через Intent точно так же, как вы интегрируете со сканером штрих-кода. (Однако это платное приложение.)

Попробуйте это: добавить android:screenOrientation="sensorPortrait"

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

Я пробовал различные исправления, предложенные в других ответах, но распознавание штрих-кода оставалось ненадежным.

Я настоятельно рекомендую использовать репозиторий ниже в портретном режиме. Попробуйте, это быстро и стабильно. Я использовал это в своем гибридном приложении.

https://github.com/Dbuggerx/BarcodeScanner

В вашей библиотеке перейдите к файлу манифеста, измените строку ниже под тегом активности

android:screenOrientation="portrait"
Другие вопросы по тегам