Android Zxing cambia la orientación al retrato
Estoy tratando de girar pantalla Zxing después de leer algunas preguntas y mensajes sobre el tema. Después de seguir las instrucciones, la pantalla giró, pero el rectángulo del escáner no está posicionado como debería (como puede verse en la imagen adjunta).
Esto es lo que he hecho:
- Escáner QR con ZXing y ZBar no lee códigos de baja calidad en las tarjetas
- Conflicto Android drawable de la identificación del recurso?
- Escaneo de códigos QR sin cámara de pantalla completa
- Introducción a ZXing en Android
- ¿Cómo integrar ZXing api con cámara frontal en android?
-
En CameraConfigurationManager:
camera.setDisplayOrientation(90);
-
En 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;
-
En 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;
- EXCEPCIÓN INESPERADA DE SUPERIOR NIVEL: com.android.dex.DexException
- ¿Cómo usar Zxing para el escáner de código qr sin usar la cámara?
- Cómo obtener un error de cámara en la aplicación de código de barras de Zxing
- Escaneo de códigos de barras / código de barras de ZXing QR
- Recursos para Android de Xamarin NotFoundException ZXingNetMobile
- Zxing usando diseño personalizado
- ¿Puedo controlar la linterna sin usar android.hardware.Camera?
- Llamar escáner de código de barras en un clic de botón en la aplicación android
Después de muchos problemas, encontré el problema, y espero que ayude a alguien en el futuro.
En el método initFromCameraParameters
en CameraConfigurationManager
hay una suposición de que la exploración está ALWAYS in landscape mode
y, por lo tanto, una corrección cuando width < height
. Si sigue los pasos de la pregunta y elimina esta comprobación, funciona bien.
¡¡Gracias por su respuesta!! Realmente me ayudó, una cosa que me di cuenta es que al menos en zxing 2.1 que necesita para pasar "rotatedData" a buildLuminanceSource en lugar de sólo "datos", la línea de terminar así:
PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(rotatedData, width, height);
Espero que esto ayude a otra persona!
Bueno hice un pequeño cambio en ProjectLibrary (proyecto xzing) y capaz de cambiar el paisaje de orientación a retrato
En el setDesiredCameraParameters method of class CameraConfigurationManager
añadido
camera.setDisplayOrientation(90);
.. en el archivo AndroidManifest.xml
mi proyecto original. He establecido screenOrientation = portrait
y su funcionamiento muy bien en mi 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>
-
En
CameraConfigurationManager
:camera.setDisplayOrientation(90);
-
En
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;
-
En
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;
-
En
CameraConfigurationManager
:if (width > height) { Log.i(TAG, "Display reports portrait orientation; assuming this is incorrect"); int temp = width; width = height; height = temp; }
-
Cambiar
android:screenOrientation="portrait"
paraCaptureActivity
en el manifiesto.
Soy desarrollador de Barcode Scanner. Sí, se necesita mucho más que esto para hacer que escanee en modo retrato. Tienes que "girar" los datos de la imagen y explicar la orientación del dispositivo, su orientación predeterminada y la orientación de su sensor.
Barcode Scanner + escanea en modo vertical, y puede integrarse con él a través de Intent exactamente de la misma manera que se integra con Barcode Scanner . (Sin embargo, es una aplicación de pago).
Como de la biblioteca zxing: 2.2.0 el apoyo para el cambio de orientación es inherente
Añada o edite lo siguiente en el manifiesto:
<activity android:name="com.journeyapps.barcodescanner.CaptureActivity" android:screenOrientation="fullSensor" tools:replace="screenOrientation" />
Establecer propiedad adicional en la llamada al escáner:
IntentIntegrator integrator = new IntentIntegrator(this); //allows portrait/landscape mode integrator.setOrientationLocked(false);//"additional property" integrator.initiateScan();
Enlace de referencia: https://github.com/journeyapps/zxing-android-embedded#changing-the-orientation
He probado varios parches, sugerido en otras respuestas, pero el reconocimiento de códigos de barras no era confiable.
Recomiendo usar el repositorio a continuación en modo retrato. Pruébalo, es rápido y estable. Lo usé en mi aplicación híbrida.
- ¿Hay alguna manera de cambiar el valor de android: windowSoftInputMode de la clase java?
- Android – ¿cómo configurar el color de fondo de todas las pantallas?