2011-11-04 41 views
10

Actualmente, la biblioteca zxing solo es compatible con el modo horizontal. Para mi aplicación, debo usarla en modo retrato¿Cómo usar Zxing en modo vertical?

+1

Esto es lo que puede hacer con ZXing 2.1. http://stackoverflow.com/questions/16252791/how-to-show-zxing-camera-in-portrait-mode-on-android/16252917#16252917 – Roylee

+0

A partir de Zing 2.2.0 hay una propiedad que puede establecer para la orientación , remítase a esta [respuesta] (https://stackoverflow.com/a/44284764/2584794) – Anup

Respuesta

17

Solo echa un vistazo al problema para Usar Zxing en modo retrato.

+2

Este enlace está obsoleto. –

+2

El enlace lleva al problema "Código QR no admite Unicode" ... Consulte esto https://github.com/journeyapps/zxing-android-embedded/issues/16 en su lugar – kristyna

+0

Si está utilizando la versión 3.xx , declara la orientación en AndroidManifest.xml. Para obtener más información, lee https://github.com/journeyapps/zxing-android-embedded/blob/master/README.md#changing-the-orientation – kristyna

5

setDisplayOrientation(int) no afecta el orden de la matriz de bytes pasada en PreviewCallback.onPreviewFrame. (Consulte Javadoc para información adicional)

Esto significa que usted necesita para hacer girar el retorno de datos de previewCallback, pero esto es los datos YUV, es necesario convertir los datos al rgb para rotarlos. Es posible escanear el código de barras en modo vertical, pero llevará más tiempo porque necesita más tiempo para procesar los datos de yuv a rgb y rotar los datos de rgb. por lo que el asunto aquí es ¿cómo podemos obtener los datos de yuv de previewcallback para el modo vertical? cuando establecemos setPreviewSize para los parámetros de la cámara obtendremos una excepción si no se admite la previsualización. Aquí está el asunto de este problema. Si el controlador de la cámara no es compatible con previewSize para el modo vertical (alto> ancho), no puede obtener los datos del yuv en modo vertical. Y el resto depende de usted, puede escanear el código de barras en modo vertical, pero lleva más tiempo o tiene que cambiar de orientación de pantalla a imagen para obtener un resultado más rápido.

2
  1. Con el fin de hacer que el trabajo de la pantalla en el retrato, establecer la orientación de retrato para la actividad (por ejemplo, en el manifiesto) y luego config la cámara: Use camera.setDisplayOrientation (90) en CameraConfigurationManager.setDesiredCameraParameters (cámara de la cámara). Pero tenga en cuenta que:

    • setDisplayOrientation (int) requiere Android 2.2
    • setDisplayOrientation (int) no afecta al orden de la matriz de bytes aprobada en PreviewCallback.onPreviewFrame. (Consulte JavaDoc para obtener información adicional)
  2. Como los marcos de vista previa siempre están en "paisaje", necesitamos rotarlos. Utilicé la rotación en sentido horario ofrecida por comment #11. No olvide cambiar los parámetros de ancho y alto después de la rotación. DecodeHandler.java, rotar los datos antes de buildLuminanceSource en decodificación (byte [] de datos, anchura int, altura int)

    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. también modifiqué CameraManager.java, getFramingRectInPreview(), según lo recomendado por # 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. No modifiqué getCameraResolution(). Esa es la segunda diferencia con respecto a # c11.

Como resultado, tengo el trabajo de escaneo de códigos UPC y otros 1D en retrato.

P.S. También puede ajustar el tamaño de FramingRect (que es el rectángulo visible en la pantalla durante el escaneo), y FramingRectInPreview se ajustará automáticamente.

+1

edita y soluciona el problema de formateo. .. – kleopatra

+1

Un buen parche para zxing: https://gist.github.com/border/7577978 – WarrenFaith

1

utilizar esta biblioteca androide https://github.com/SudarAbisheck/ZXing-Orient

Es compatible tanto con orientación vertical como horizontal.

+1

Revisa [Haz una visita] (http://stackoverflow.com/tour) y [Tu respuesta está en otro castillo : Cuando una respuesta no es una respuesta] (http://meta.stackexchange.com/questions/225370) – Drew

+0

@Drew en mi opinión es una respuesta decente ... el OP quiere una versión de ZXing que admita más el retrato, y esta respuesta ofrece exactamente eso. Me ayudó con el mismo requisito. –

+0

Estoy seguro de que así fue. Hace años, las solicitudes de recursos estaban bien en este sitio. Las pautas cambiaron. Y cuando llegan respuestas nuevas con respuestas de solo enlaces, a menudo obtienes los comentarios que te di. – Drew

6

Aquí está la solución de escaneado modo vertical

primera declarar estas dos líneas en su nivel de aplicación de archivos Gradle

compile 'com.journeyapps:zxing-android-embedded:[email protected]' 
compile 'com.google.zxing:core:3.2.0' 

Definir un botón en el archivo XML y en Onclick Oyente de botón escriba debajo código en el archivo 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(); 

escriba debajo de código en y nuestro archivo MainActivity java, después del método 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(); 

    } 
    } 

} 

a continuación, crear una clase con el nombre CaptureActivityPortrait que se extiende CaptureActivity. La clase se parece a continuación

package soAndSo(Your PackageName); 

    import com.journeyapps.barcodescanner.CaptureActivity; 

    public class CaptureActivityPortrait extends CaptureActivity { 
    } 

y más importante declarar su CaptureActivityPortrait en el archivo de manifiesto, como a continuación

<activity android:name=".CaptureActivityPortrait" 
     android:screenOrientation="portrait" 
     android:stateNotNeeded="true" 
     android:theme="@style/zxing_CaptureTheme" 
     android:windowSoftInputMode="stateAlwaysHidden"></activity> 
Cuestiones relacionadas