web-dev-qa-db-fra.com

Android Zxing changez d'orientation en portrait

J'essaie de faire pivoter l'écran après avoir lu quelques questions et commentaires sur le problème . Après avoir suivi les instructions, l'écran pivote, mais le rectangle du scannern'est pas positionné comme il se être vu sur l'image ci-jointe).

Voici ce que j'ai fait:

  1. dans CameraConfigurationManager:

    camera.setDisplayOrientation(90);
    
  2. dans 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;
    
  3. dans 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;
    

enter image description here

44
Udi Idan

Après avoir beaucoup lutté, j'ai trouvé le problème et j'espère que cela aidera quelqu'un à l'avenir.

Sur la méthode initFromCameraParameters dans CameraConfigurationManager, il est supposé que l'analyse est ALWAYS in landscape mode et donc un correctif lorsque width < height. Si vous suivez les étapes de la question et supprimez cette vérification, tout fonctionne correctement.

30
Udi Idan

Merci pour votre réponse!! cela m'a vraiment aidé, une chose que j'ai remarquée, c'est qu'au moins sur zxing 2.1, vous devez passer "rotatedData" à buildLuminanceSource au lieu de "data", la ligne se termine comme ceci:

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

Espérons que cela aide quelqu'un d'autre!

14
Roberto

À partir de la bibliothèque zxing: la prise en charge du changement d'orientation par la version 2.2.0 est inhérente

Ajouter/modifier les éléments suivants dans le manifeste:

<activity
    Android:name="com.journeyapps.barcodescanner.CaptureActivity"
    Android:screenOrientation="fullSensor"
    tools:replace="screenOrientation" />

Définir une propriété supplémentaire lors de l'appel du scanner:

IntentIntegrator integrator = new IntentIntegrator(this);

//allows portrait/landscape mode
integrator.setOrientationLocked(false);//"additional property"
integrator.initiateScan();

Lien de référence: https://github.com/journeyapps/zxing-Android-embedded#changing-the-orientation

7
Anup

Je suis un développeur de Barcode Scanner. Oui, il faut beaucoup plus que cela pour le faire numériser en mode portrait. Vous devez "faire pivoter" les données d'image et prendre en compte l'orientation du périphérique, son orientation par défaut et l'orientation de son capteur.

Barcode Scanner + scanne en mode portrait et vous pouvez y intégrer via Intent exactement de la même manière que vous intégrez avec Barcode Scanner . (Cependant, c'est une application payante.)

4
Sean Owen

essayez ceci: ajoutez Android:screenOrientation="sensorPortrait"

<activity Android:name=".CaptureActivity"
              Android:screenOrientation="sensorPortrait"
              Android:clearTaskOnLaunch="true"
              Android:stateNotNeeded="true"
              Android:theme="@style/CaptureTheme"
              Android:windowSoftInputMode="stateAlwaysHidden"
1
rizujikeda

J'ai essayé divers correctifs, suggérés dans d'autres réponses, mais la reconnaissance du code à barres restait peu fiable.

Je recommande fortement d'utiliser le référentiel ci-dessous en mode portrait. Essayez, c'est rapide et stable. Je l'ai utilisé dans mon application hybride.

https://github.com/Dbuggerx/BarcodeScanner

1
Loi Nguyen

Dans votre bibliothèque, allez dans le fichier manifeste changez la ligne ci-dessous sous le tag d'activité

Android:screenOrientation="portrait"
0
Syed Danish Haider