49 votes

Android Zxing changez d'orientation en portrait

Je suis en train de faire pivoter Zxing affichage après la lecture de quelques questions et messages sur la question. Après avoir suivi les instructions, l'écran fait tourner, mais le rectangle de le scanner n'est pas positionné comme il se doit (comme on peut le voir sur l'image ci-jointe).

C'est 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

30voto

Udi I Points 1491

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 TOUJOURS en mode paysage, et est donc corrigée lorsque largeur <hauteur. Si vous suivez les étapes de la question et supprimez cette vérification, cela fonctionne correctement.

14voto

Roberto Points 266

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!

8voto

Yousuf Qureshi Points 296

Eh bien, j'ai apporté une petite modification à ProjectLibrary (projet xzing) et capable de changer le paysage d'orientation en portrait

Dans la méthode setDesiredCameraParameters de la classe CameraConfigurationManager ajoutée

camera.setDisplayOrientation (90); //

.. dans le fichier AndroidManifest.xml de mon projet d'origine. J'ai défini screenOrientation = portrait et son fonctionnement est correct sur mon 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> 
 

5voto

  1. En CameraConfigurationManager :

     camera.setDisplayOrientation(90);
     
  2. 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;
     
  3. 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;
     
  4. En CameraConfigurationManager :

     if    (width > height) {
      Log.i(TAG, "Display reports portrait orientation; assuming this is incorrect");
      int temp = width;
      width = height;
      height = temp;
    }
     
  5. Changer android:screenOrientation="portrait" pour CaptureActivity dans le manifeste.

4voto

Sean Owen Points 36577

Je suis un développeur de Scanner de code à Barres. Oui, il faut beaucoup plus que cela pour faire de scan en mode portrait. Vous avez pour "faire tourner" les données d'image, et de rendre compte de l'orientation de l'appareil, de son orientation par défaut, et son capteur d'orientation.

Scanner de code à barres+ scans en mode portrait, et vous pouvez intégrer avec elle via Intention exactement de la même manière que vous intégrer avec le Scanner de code-Barres. (Mais c'est un pour-pay app.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X