2016-02-15 8 views
10

Ich bin ein bisschen Neuling in Android-Entwicklung, so dass meine Entschuldigung im Voraus, wenn meine Frage trivial ist. In einem Teil meiner App benötige ich eine Live-Vorschau meiner Rückfahrkamera, also habe ich eine benutzerdefinierte Klasse erstellt, die SurfaceView erweitert und SurfaceHolder.Callback implementiert (ich befolgte im Grunde die Anweisungen in der Android-Dokumentation).Nexus 5x rückwärts Landschaftssensor in einer Android-Kamera Vorschau App

Leider teste ich meine App in einem Nexus 5x, das ich gerade festgestellt habe, dass es den Kamerasensor auf eine umgekehrte Weise installiert hat. Aus diesem Grund erscheint die Kameravorschau meiner App, wenn sie auf meinem Nexus 5x läuft, auf dem Kopf stehend, was ich nicht möchte.

Es scheint, dass die neue android.hardware.camera2 API dieses Problem automatisch beheben kann. Irgendwann muss ich meinen gesamten Code mit dieser neuen API aktualisieren, aber für den Moment brauche ich eine schnelle Lösung, während ich die alte Kamera-API verwende.

Also habe ich dort gelesen und ich fand ein Stück Code, den ich in der SurfaceChanged-Methode zur Umgehung dieses Problems einführen müsste. Hier ist es:

Display display = ((WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 

     if(display.getRotation() == Surface.ROTATION_0) 
     { 
      parameters.setPreviewSize(capHeight, capWidth);       
      camera.setDisplayOrientation(90); 
     } 

     if(display.getRotation() == Surface.ROTATION_90) 
     { 
      parameters.setPreviewSize(capWidth, capHeight);       
     } 

     if(display.getRotation() == Surface.ROTATION_180) 
     { 
      parameters.setPreviewSize(capHeight, capWidth);    
     } 

     if(display.getRotation() == Surface.ROTATION_270) 
     { 
      parameters.setPreviewSize(capWidth, capHeight); 
      camera.setDisplayOrientation(180); 
     } 

     camera.setParameters(parameters);*/ 

     camera.startPreview(); 

Das Problem ist, dass ich nicht sehe, dass sich etwas geändert hat.

Irgendwelche Gedanken?

Antwort

0

Gleiches hier. Da camera2 Geräte < API 21 nicht unterstützt und die zwei APIs nicht implementieren möchten, wäre es nett, eine schnelle Lösung zu erhalten.

Ich versuche, ungefähr wie:

if (Build.MODEL.equals("Nexus 5x")){ 
    // rotate camera 180° 
    mCamera.setDisplayOrientation(180); 
} 

Aber kann die Anzeige der Kamera nicht drehen. Werde prüfen, ob es etwas mit dem PreviewCallback zu tun hat

Ist es eine schlechte Sache, die 2 Apis zu benutzen? Wie in diesem Thema wird es nicht empfohlen: How to use Android's camera or camera2 API to support old and new API versions without deprecation notes?

+1

Was ist mit Nexus 6P? – innich

9

Die 5X-Kamera ist nicht "umgekehrt"; es weist die korrekte Ausrichtung der Kamera in seinen Parametern, so dass keine speziellen Abhilfen benötigt werden, so stellen Sie sicher, dass Sie die Anzeigeausrichtung sind Einstellung richtig:

public static void setCameraDisplayOrientation(Activity activity, 
    int cameraId, android.hardware.Camera camera) { 
android.hardware.Camera.CameraInfo info = 
     new android.hardware.Camera.CameraInfo(); 
android.hardware.Camera.getCameraInfo(cameraId, info); 
int rotation = activity.getWindowManager().getDefaultDisplay() 
     .getRotation(); 
int degrees = 0; 
switch (rotation) { 
    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; 
} 

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

Von http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation%28int%29

+4

Das ist korrekt für die Vorschau, aber wenn Sie das aufgenommene Bild bearbeiten wollen, müssen Sie noch die Kameradrehung betrachten, die 270 im Vergleich zu 90 auf den meisten Geräten ist (was bedeutet, dass das Bild auf dem Kopf steht). –

+5

@EmanuelMoecklin Ja, der obige Code behebt das Kamera-Display, aber die gezeigten Bilder sind immer noch auf dem Kopf stehend, wie kann ich dieses Problem beheben? – user2056563

+0

Ich drehte das Bild mit OpenCV4Android – Heribert

3
if (Build.MODEL.equals("Nexus 5X")){ 
    // rotate camera 180° 
    mCamera.setDisplayOrientation(180); 
} 

ändern 5x bis 5X wird in Ordnung sein.