Android Zxing меняет ориентацию на портретную
Я пытаюсь повернуть экран Zxing после прочтения нескольких вопросов и сообщений о проблеме. После выполнения инструкций дисплей все-таки повернулся, но прямоугольник сканера не расположен должным образом (как видно на прилагаемом изображении).
Вот что я сделал:
в CameraConfigurationManager:
camera.setDisplayOrientation(90);
в 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;
в 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>
В
CameraConfigurationManager
:camera.setDisplayOrientation(90);
В
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;
В
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;
В
CameraConfigurationManager
:if (width > height) { Log.i(TAG, "Display reports portrait orientation; assuming this is incorrect"); int temp = width; width = height; height = temp; }
+ Изменить
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"
Я пробовал различные исправления, предложенные в других ответах, но распознавание штрих-кода оставалось ненадежным.
Я настоятельно рекомендую использовать репозиторий ниже в портретном режиме. Попробуйте, это быстро и стабильно. Я использовал это в своем гибридном приложении.
В вашей библиотеке перейдите к файлу манифеста, измените строку ниже под тегом активности
android:screenOrientation="portrait"