Zxing-Kamera im Hochformat auf Android

Lesezeit: 5 Minuten

Zxing Kamera im Hochformat auf Android
Roy Lee

Ich will zeigen portrait Orientierung an Zxings Kamera.

Wie kann dies geschehen?

  • Hier ist die Lösung

    – Mamadali Alizadeh

    27. August 2018 um 5:40 Uhr


Zxing Kamera im Hochformat auf Android
Roy Lee

So funktioniert das.

Schritt 1: Fügen Sie die folgenden Zeilen hinzu, um die Daten vorher zu drehen buildLuminanceSource(..) in decodieren (Byte[] Daten, Int-Breite, Int-Höhe)

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;

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

Schritt 2: Ändern getFramingRectInPreview().

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;

Schritt 3: Deaktivieren Sie die Überprüfung für den Querformatmodus in initFromCameraParameters(...)

CameraConfigurationManager.java

//remove the following
if (width < height) {
  Log.i(TAG, "Display reports portrait orientation; assuming this is incorrect");
  int temp = width;
  width = height;
  height = temp;
}

Schritt 4: Fügen Sie die folgende Zeile hinzu, um die Kamera hineinzudrehensetDesiredCameraParameters(...)

CameraConfigurationManager.java

camera.setDisplayOrientation(90);

Schritt 5: Vergessen Sie nicht, die Ausrichtung der Aktivität auf Hochformat einzustellen. Dh: manifestieren

  • Das ist ziemlich gut! obwohl Sie von der Unterstützung der Landschaft nur zur Unterstützung des Porträts wechseln und nicht beides. Dies funktioniert auch nicht für Frontkameras oder die umgekehrte Hochformatausrichtung.

    – Sean Owen

    27. April 2013 um 14:13 Uhr

  • diese Ausnahme zeigt FATAL EXCEPTION: Thread-9 java.lang.IllegalArgumentException: Rechteck zuschneiden passt nicht in Bilddaten. : unter com.google.zxing.client.android.PlanarYUVLuminanceSource.(PlanarYUVLuminanceSource.java:46) : unter com.google.zxing.client.android.camera.CameraManager.buildLuminanceSource(CameraManager.java:275) unter com .google.zxing.client.android.DecodeHandler.decode(DecodeHandler.java:80) E/AndroidRuntime(5523): at com.google.zxing.client.android.DecodeHandler.handleMessage(DecodeHandler.java:54)

    – Rohit

    13. Juli 2013 um 10:47 Uhr

  • @Roylee, hey danke, es funktioniert, ich möchte fragen, ob es je nach Sensor sowohl im Quer- als auch im Hochformat funktionieren kann. Bitte helfen Sie, wenn Sie können

    – Rohit

    15. Juli 2013 um 4:22 Uhr

  • Ja, ich bin ihnen buchstabengetreu gefolgt, aber es würde nie nach mir suchen: Ich habe jedoch eine Lösung gefunden. Nicht drehen haha! Ich verwende es für QR-Codes, also funktioniert es in beide Richtungen, also werde ich einfach jeden Text aus der Ansicht entfernen und es dabei belassen! Aber danke für die Sorge.

    – Russel Cargill

    15. August 2013 um 9:04 Uhr

  • hat bei mir funktioniert, obwohl das Kamerabild etwas außerhalb des Seitenverhältnisses liegt (qrcode, nexus4)

    – Lukas Jota

    2. Januar 2014 um 16:20 Uhr

Zxing Kamera im Hochformat auf Android
Rensodarwin

Um alle Orientierung zu unterstützen und sich beim Drehen der Aktivität automatisch zu ändern, müssen Sie nur die ändern CameraManager.javaKlasse.

Und entfernen Sie diese Methode getCurrentOrientation() von CaptureActivity.java

Erstellen Sie in CameraManager.java diese Variable:

int resultOrientation;

Fügen Sie dies der Methode openDriver(..) hinzu:

setCameraDisplayOrientation(context, Camera.CameraInfo.CAMERA_FACING_BACK, theCamera);//this can be set after camera.setPreviewDisplay(); in api13+.

****Diese Methode erstellen**** Link: http://developer.android.com/reference/android/hardware/Camera.html

public static void setCameraDisplayOrientation(Context context,int cameraId, android.hardware.Camera camera) {
    android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
    android.hardware.Camera.getCameraInfo(cameraId, info);
    Display display = ((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
    int degrees = 0;
    switch (display.getRotation()) {
    case Surface.ROTATION_0: degrees = 0; break;
    case Surface.ROTATION_90: degrees = 90; break;
    case Surface.ROTATION_180: degrees = 180; break;
    case Surface.ROTATION_270: degrees = 270; break;
    }


    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
        resultOrientation = (info.orientation + degrees) % 360;
        resultOrientation = (360 - resultOrientation) % 360;  // compensate the mirror
    } else {  // back-facing
        resultOrientation = (info.orientation - degrees + 360) % 360;
    }
    camera.setDisplayOrientation(resultOrientation);
}

****Ändere jetzt getFramingRectInPreview()****

if(resultOrientation == 180 || resultOrientation == 0){//to work with landScape and reverse landScape
            rect.left = rect.left * cameraResolution.x / screenResolution.x;
            rect.right = rect.right * cameraResolution.x / screenResolution.x;
            rect.top = rect.top * cameraResolution.y / screenResolution.y;
            rect.bottom = rect.bottom * cameraResolution.y / screenResolution.y;
        }else{
            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;
        }

Und ändern Sie diese Methode public PlanarYUVLuminanceSource buildLuminanceSource(..)

if(resultOrientation == 180 || resultOrientation == 0){//TODO: This is to use camera in landScape mode
        // Go ahead and assume it's YUV rather than die.
        return new PlanarYUVLuminanceSource(data, width, height, rect.left, rect.top, rect.width(), rect.height(), false);
    }else{
        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;
        return new PlanarYUVLuminanceSource(rotatedData, width, height, rect.left, rect.top, rect.width(), rect.height(), false);
    }

  • es bricht das Skalierungsverhältnis der Vorschau auf einigen Geräten

    – Mustafa

    29. Mai 2015 um 10:01 Uhr

  • @mustafa Ich glaube, das ist der Grund, warum sie die Rotation in ihrer eigenen Version der Bibliothek nicht unterstützen.

    – Rensodarwin

    3. September 2015 um 13:27 Uhr

Sie können meinen Fork von zxlib verwenden https://github.com/rusfearuth/zxing-lib-without-landscape-only. Ich habe nur den Querformatmodus deaktiviert. Sie können Landschaft/Hochformat einstellen und die korrekte Kameraansicht sehen.

Zxing Kamera im Hochformat auf Android
Samit Dawane

Hinzufügen camera.setDisplayOrientation(90); in CameraConfigurationManager.java hat bei mir funktioniert.

für zxing 3.0, funktionierende lib https://github.com/xiaowei4895/zxing-android-portrait
für Hochformat

Danke

Ich denke, die beste Lösung nur für Bibliotheken ist diese …

https://github.com/SudarAbischeck/ZXing-Orient

Sie können es in build.gradle als Abhängigkeit Ihres Projekts im Maven-Format einfügen …

dependencies {
  compile ''me.sudar:zxing-orient:[email protected]''
}

1645840987 241 Zxing Kamera im Hochformat auf Android
Nathan Tuggy

Erstellen Sie AnyOrientationCaptureActivity und überschreiben Sie dann die Standard-CaptureActivity, dann wird es funktionieren.

public void scanCode() {
    IntentIntegrator integrator = new IntentIntegrator(this);
    integrator.setDesiredBarcodeFormats(CommonUtil.POSEIDON_CODE_TYPES);
    integrator.setPrompt("Scan");
    integrator.setCameraId(0);
    integrator.setBeepEnabled(false);
    integrator.setBarcodeImageEnabled(false);
    integrator.setOrientationLocked(false);
    //Override here
    integrator.setCaptureActivity(AnyOrientationCaptureActivity.class);

    integrator.initiateScan();
}

//create AnyOrientationCaptureActivity extend CaptureActivity
public class AnyOrientationCaptureActivity extends CaptureActivity {
}

Im Manifest definieren

<activity
            android:name=".views.AnyOrientationCaptureActivity"
            android:screenOrientation="fullSensor"
            android:stateNotNeeded="true"
            android:theme="@style/zxing_CaptureTheme"
            android:windowSoftInputMode="stateAlwaysHidden"></activity>

  • Captureactivity ist ein Ersatz für normale Extends-Aktivität?

    – Gumuruh

    19. Dezember 2020 um 3:35 Uhr

859120cookie-checkZxing-Kamera im Hochformat auf Android

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy