Ich will zeigen portrait
Orientierung an Zxing
s Kamera.
Wie kann dies geschehen?
Roy Lee
Ich will zeigen portrait
Orientierung an Zxing
s Kamera.
Wie kann dies geschehen?
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.
– 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
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.
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]''
}
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
Hier ist die Lösung
– Mamadali Alizadeh
27. August 2018 um 5:40 Uhr