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

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

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

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

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

  1. Чтобы сделать работу на экране в портретной ориентации, задайте портретную ориентацию для действия (например, в манифесте), а затем настройте камеру: используйте функцию camera.setDisplayOrientation (90) в CameraConfigurationManager.setDesiredCameraParameters (Камера). Но имейте в виду, что:

    • SetDisplayOrientation (int) требует Android 2.2
    • SetDisplayOrientation (int) не влияет на порядок массива байтов, переданный в PreviewCallback.onPreviewFrame. (Дополнительную информацию см. В JavaDoc)
  2. Поскольку кадры предварительного просмотра всегда находятся в «ландшафте», нам необходимо повернуть их. Я использовал поворот по часовой стрелке, предложенный комментарием № 11 . Не забывайте менять параметры ширины и высоты после вращения. DecodeHandler.java, вращать данные перед buildLuminanceSource в декодировании (байт [] data, 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 будет автоматически настроен.

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

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

 compile 'com.journeyapps:zxing-android-embedded:3.0.1@aar' compile '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> 

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

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