2013-03-23 10 views
8

Ich arbeite mit einer so tollen Bibliothek zxing QR-Code zu lesen. Ich habe QR-Code bereits erfolgreich erhalten.Kundenspezifische Kameraansicht & Rotation in Zxing für QR-Code?

Jetzt läuft meine Anwendung im Querformat und Kamera nimmt den ganzen Bildschirm und rote QR-Erkennung Rechteck-Box ist in der Mitte. Ich möchte dies in Hochformat ändern & ersetzen Sie die Kameraansicht nur mit der roten QR-Erkennung Rechteck-Box.

Ich ändern CaptureActivity-Tag, die in der zxing Bibliothek Manifest-Datei ist.

android:screenOrientation="portrait".

Aber nichts gefunden was ich eigentlich will. Ich weiß nicht, wo ich Code ändern/schreiben muss, um das zu bekommen.

+1

Die Optimierung ist einfach, obwohl ein wenig Änderungen über mehrere Dateien benötigen. Hier habe ich eine komplette Lösung für diese Frage gestellt: http://stackoverflow.com/questions/16252791/how-to-show-zxing-camera-in-portrait-mode-android/16252917#16252917 – Roylee

+1

@roylee: danke, Ihr Code läuft auch gut .. –

Antwort

5

Ich war in demselben Problem und blieb etwa 2 Tage dran. Eigentlich müssen Sie einige Aufgaben erledigen, um Ihr Ziel zu erreichen.

  1. herunterladen ZXing Bibliothek für Lese QR Code .. (Ich hoffe, Sie haben bereits)
  2. ein Projekt erstellen und ZXing Bibliothek hinzuzufügen.
  3. Ihre main.xml Datei sollte wie folgt aussehen:

    public class ScannerActivity extends CaptureActivity { 
    
         @Override 
         public void onCreate(Bundle savedInstanceState) { 
          super.onCreate(savedInstanceState); 
          setContentView(R.layout.main); 
    
         } 
    
         @Override 
         public void handleDecode(Result rawResult, Bitmap barcode) 
         { 
        Toast.makeText(this.getApplicationContext(), "Scanned code " + rawResult.getText(), Toast.LENGTH_LONG).show(); 
         } 
        } 
    
  4. In der Manifest-Datei hinzufügen Erlaubnis folgende:

    <uses-permission android:name="android.permission.CAMERA"/> 
    
  5. <?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 
    
    <TextView 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/hello" /> 
    
    <FrameLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_gravity="center_horizontal"> 
        <include layout="@layout/capture"/> 
    </FrameLayout> 
    
    </LinearLayout> 
    
  6. Ihre Hauptaktivität soll wie folgt aussehen

  7. und schließlich sehr wichtige Aufgabe, die Sie für die Kamera drehen müssen n Problem, ersetzt die folgende Methode in die

CameraManager.java (im Paket com.google.zxing.client.android.camera)

@SuppressLint("NewApi") public void startPreview() { 
    Camera theCamera = camera; 
    if (theCamera != null && !previewing) { 
     theCamera.setDisplayOrientation(90); 
     theCamera.startPreview(); 
     previewing = true; 
    } 
    } 

das ist alles. run und genießen :-)

danke ..

+0

Sie müssen die Klasse CaptureActivity vor dem Erweitern in non final ändern. –

+0

Wer hat es in Delphi XE5 verwendet? –

1

Ich hatte wirklich schreckliche Erfahrung aus dieser Bibliothek aus dem gleichen Grund. Selbst wenn die Kamera im Hochformat angezeigt wird, wird sie möglicherweise gestreckt (oder das Ausgabebild wird gestreckt oder der Barcode wird nicht erkannt, oder bei einigen Geräten funktionierte es einwandfrei, andere nicht).

Ich vermute, dass Android einfach "mag", dass die Kameravorschau im Querformatmodus ist, da dies ihre natürliche Ausrichtung ist, wenn der Benutzer Bilder macht.

Am Ende habe ich den Querformat-Modus verwendet und alles andere gedreht, so dass der Benutzer denkt, dass es im Hochformat ist, aber das ist es nicht. Ich denke, viele Apps verwenden diese Technik.

Ich schlage vor, dass wenn Sie es irgendwie schaffen, mit diesem Problem umzugehen, es auf so vielen Geräten wie möglich testen.

+0

Die Bibliothek selbst interessiert sich überhaupt nicht für die Orientierung. Die App ist nur für die Landschaft geeignet. Sie können sie also nicht für das Hochformat verwenden. Sie sollten jedoch trotzdem eine neue App erstellen. Android-Kameras sind "in der Regel" montiert, so dass die Landschaft die natürliche Orientierung ist, aber Sie müssen die API fragen, um wirklich sicher zu wissen! Ja, Sie müssen das Bild nicht wirklich drehen, aber Sie müssen die Vorschauauflösung und Drehung korrekt anpassen. –

+0

Haben Sie eine Probe, um zu zeigen, wie es geht, sowohl für einfache Kamera-App (Vorschau & Capture) und eine für diese Bibliothek? –

+0

Problem ist, dass es kein passendes Beispiel/Tutorial gibt. Nur diese App lol –

5

Bitte kopieren Sie unsere App nicht vollständig. In diesem Fall müssen Sie trotzdem Ihre eigene App schreiben. Es ist definitiv nicht so einfach wie die Layout-Ausrichtung zu ändern. Die Benutzeroberfläche wird nicht nur für das Hochformat geschrieben, auch der App-Code ist nicht vorhanden.

Wenn Sie nur fixierten Hochformat verwenden möchten, dann ist dies nicht so schwer. Es ist schwierig, alle 4 Rotationen mit Front-/Rückseitenkameras vollständig zu unterstützen. Aber nicht nur 1 Fall.

Zuerst müssen Sie ein Portrait-Mode-UI entwerfen. (Bitte nicht das rote Linienmuster kopieren.)

Der eigentliche App-Code interessiert sich nicht für die Ausrichtung von QR-Codes. Sie müssen überhaupt nichts tun. Sie müssen jedoch Änderungen vornehmen, damit die Bildschirmanzeige richtig angezeigt wird.

Sie müssen Camera.getOrientation() abfragen, um festzustellen, wie die Kamera montiert ist. Normalerweise ist es so, dass "nach oben" zu Ihrer Rechten ist, und ich denke, dass fast jedes Gerät auf diese Weise kompatibel ist. Aber technisch müssen Sie wissen, wie viel Sie das Vorschaubild drehen müssen.

Dann verwenden Sie Camera.setDisplayOrientation(), um zu sagen, wie stark das Bild gedreht werden muss, damit es für den Hochformatmodus korrekt gedreht wird. Dies ist normalerweise "90".

Schließlich müssen Sie die Vorschaugröße mit Camera.Parameters.setPreviewSize() auswählen, müssen aber möglicherweise die Werte, die Sie gewählt haben (480x800 vs 800x480), spiegeln, weil Sie im Hochformat sind.