Вопрос по android – Android Zxing меняет ориентацию на портретную

44

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

Вот что я сделал:

in CameraConfigurationManager:

<code>camera.setDisplayOrientation(90);
</code>

in DecodeHandler.java

<code>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;
</code>

in CameraManager.java:

<code>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;
</code>

enter image description here

возможный дубликатHow to use Zxing in portrait mode? Sean Owen

Ваш Ответ

9   ответов
0

измените строку ниже под тегом активности

android:screenOrientation="portrait"
30

что она поможет кому-то в будущем.

НаinitFromCameraParameters метод вCameraConfigurationManager есть предположение, что сканированиеALWAYS in landscape modeи для этого исправить, когдаwidth < height. If You follow the steps in the question and remove this check, it works fine.

@ROb: Okies ....... Друзья .. вторая точка была добавлена в методе декодирования с помощью byte [] rotatedData ....
Я пользуюсь версией 2.0. Я на самом деле нашел место для кода в этой ссылке.code.google.com/p/zxing/issues/detail?id=178
Привет, я реализовал шаги 1 и 3, и теперь я могу просматривать в портретной. Я не могу найти место для реализации 2, и это мешает мне читать код в портретной. Где я должен положить код из шага 2? Я не могу найти ссылку на rotatedData в любом месте. Благодарю.
Какую версию zxing вы используете? Udi Idan
@Sam - Вам необходимо отключить проверку в классе CameraConfigurationManager, который находится в com.google.zxing.client.android.camera. Ищите "Мы только для ландшафта" и отключите эту проверку. Udi Idan
14

одна вещь, которую я заметил, это то, что по крайней мере на zxing 2.1 вам нужно передать «rotatedData» для buildLuminanceSource вместо просто «данных» строка в итоге выглядит так:

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

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

очень помог @Roberto большое спасибо.
Хорошо сверху ответа, я тоже добавил ваш :) спасибо, это работает!
Я чувствую себя настолько глупым, что не изменил это. Спасибо, это очень хорошее дополнение к информации, представленной в вопросе и принятом ответе!
7

As of zxing library:2.2.0 support for orientation change is inherent

Добавьте / отредактируйте следующее в манифесте:

<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#changing-the-orientation

это то что мне нужно Спасибо
Это сработало и для меня. Стоит упомянуть, что добавление к манифесту должно быть сделано, даже если IntentIntegrator вызывается из другой операции / фрагмента.
1

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

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

https://github.com/Dbuggerx/BarcodeScanner

4

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

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

Флип является намеренным, как я видел на примере здесь:code.google.com/p/zxing/issues/detail?id=178#c46 Udi Idan
Он вращается и сканирует, единственная проблема - расположение прямоугольника. Udi Idan
Я думаю, что вы перевернули свои x и y в коде выше. По крайней мере, так действует дисплей. х должен идти с х.
Что-то определенно перевернуто, как вы можете видеть из своего изображения. Он действует так же, как и в ландшафте. Уверены ли выcameraResolution а такжеscreenResolution ты что думаешь?
5

In CameraConfigurationManager:

camera.setDisplayOrientation(90);

In 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;

In 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;

In CameraConfigurationManager:

if    (width > height) {
  Log.i(TAG, "Display reports portrait orientation; assuming this is incorrect");
  int temp = width;
  width = height;
  height = temp;
}

Change android:screenOrientation="portrait" for CaptureActivity in manifest.

Это сработало для меня. Было бы неплохо получить правку от @Dayan и указать методы для внесения этих изменений. Единственное дополнительное изменение, которое мне нужно было сделать, это закомментировать явноеsetRequestedOrientation вCaptureActivity#onResume
1

android:screenOrientation="sensorPortrait"

<activity android:name=".CaptureActivity"
              android:screenOrientation="sensorPortrait"
              android:clearTaskOnLaunch="true"
              android:stateNotNeeded="true"
              android:theme="@style/CaptureTheme"
              android:windowSoftInputMode="stateAlwaysHidden"
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> 

Похожие вопросы