Как использовать Zxing в портретном режиме?

В настоящее время библиотека zxing поддерживает только в ландшафтном режиме. Для моего приложения мне нужно использовать в портретном режиме

10 ответов

Решение

Просто проверьте проблему для использования Zxing в портретном режиме.

Вот решение для сканирования в портретном режиме

сначала объявите эти две строки в файле Gradle уровня вашего приложения

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

Определите кнопку в вашем XML-файле и в Onclick Listener кнопки напишите код ниже в Java-файле MainActivity

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();

Запишите следующий код в свой Java-файл MainActivity после метода onCreate()

@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>

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

Чтобы использовать сканер в портретном режиме, вам нужно добавить следующее действие в свой AndroidManifest.xml,

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

И это все.

Пройдите по ссылке, чтобы узнать больше.

Пожалуйста, проверьте следующее ( Официальная документация)

Добавить это действие в файл манифеста

<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();

Надеюсь это поможет

setDisplayOrientation(int) не влияет на порядок байтового массива, передаваемого в PreviewCallback.onPreviewFrame, (Обратитесь к JavaDoc для дополнительной информации)

Это означает, что вам нужно повернуть данные, возвращаемые из previewCallback, но это yuv-данные, вам нужно преобразовать их в rgb-данные, а затем повернуть их. Можно сканировать штрих-код в портретном режиме, но это займет больше времени, потому что потребуется больше времени для обработки данных от yuv до rgb и поворота данных rgb. Итак, вопрос в том, как мы можем получить данные yuv из предварительного просмотра для портретного режима? когда мы устанавливаем setPreviewSize для параметров камеры, он получит исключение, если previewsize не поддерживается. Вот вопрос этой проблемы. Если драйвер камеры не поддерживает previewSize для портретного режима (высота> ширина), вы не сможете получить данные yuv в портретном режиме. А все остальное зависит от вас, вы можете сканировать штрих-код в портретном режиме, но это займет больше времени или вам придется изменить ориентацию экрана на альбомную, чтобы получить результат быстрее.

Просто добавьте этот код в 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" />
  1. Чтобы заставить экран работать в портретной ориентации, установите книжную ориентацию для действия (например, в манифесте), а затем настройте камеру: используйте camera.setDisplayOrientation(90) в CameraConfigurationManager.setDesiredCameraParameters(камера камеры). Но учтите, что:

    • setDisplayOrientation (int) требует Android 2.2
    • setDisplayOrientation (int) не влияет на порядок байтового массива, передаваемого в PreviewCallback.onPreviewFrame. (Обратитесь к JavaDoc для дополнительной информации)
  2. Поскольку кадры предварительного просмотра всегда находятся в "альбомном" формате, нам нужно повернуть их. Я использовал вращение по часовой стрелке, предложенное в комментарии № 11. Не забудьте поменять параметры ширины и высоты после поворота. DecodeHandler.java, вращать данные перед buildLuminanceSource в декодировании (данные byte[], int width, int height)

    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. Я также изменил CameraManager.java, getFramingRectInPreview(), как рекомендовано #c11:

    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.

В результате у меня есть сканирование UPC и других 1D кодов в портретной ориентации.

PS Также вы можете настроить размер FramingRect (это прямоугольник, видимый на экране во время сканирования), и FramingRectInPreview будет настроен автоматически.

Используйте эту библиотеку Android https://github.com/SudarAbisheck/ZXing-Orient

Поддерживает как книжную, так и альбомную ориентацию.

Добавьте этот 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"/>

Добавьте этот код в файл AndroidManifest.xml внутри тега приложения, это определенно сработает.

      <activity
        android:name="com.journeyapps.barcodescanner.CaptureActivity"
        android:screenOrientation="fullSensor"
        tools:replace="screenOrientation" />
Другие вопросы по тегам