2012-11-21 11 views
11

Ich habe eine Kamera App erstellt und möchte meine App in allen 4 möglichen Ausrichtungen drehen lassen und die Kameravorschau entsprechend aktualisieren. Dafür habe ich die folgende Methode verwendet, die ich von kopiert habe: Android - Camera preview is sidewaysAndroid: Bildschirmausrichtung/Rotation für Kamera Vorschau

public void updateCameraDisplay(int w, int h) { 
     // set preview size and make any resize, rotate or 
     // reformatting changes here 

     Log.i("CameraPreviews", "Updating camera orientation with w=" + w 
       + " and h=" + h); 
     Parameters parameters = camera.getParameters(); 
     Display display = getActivity().getWindowManager() 
       .getDefaultDisplay(); 

     int rotation = getActivity().getResources().getConfiguration().orientation; 
     Log.i("CameraPreviews", "rotation is " + display.getRotation()); 
     if (display.getRotation() == Surface.ROTATION_0) { 

      parameters.setPreviewSize(h, w); 
      camera.setDisplayOrientation(0); 
     } 

     if (display.getRotation() == Surface.ROTATION_90) { 
      parameters.setPreviewSize(w, h); 
      camera.setDisplayOrientation(270); 
     } 

     if (display.getRotation() == Surface.ROTATION_180) { 
      parameters.setPreviewSize(h, w); 
      camera.setDisplayOrientation(180); 
     } 

     if (display.getRotation() == Surface.ROTATION_270) { 
      parameters.setPreviewSize(w, h); 
      camera.setDisplayOrientation(90); 
     } 

     try { 
      camera.setParameters(parameters); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

ich die Werte tweeked habe, so dass sie auf der Galaxie tab2 Samsung testete schließlich die richtigen Orientierungen bestimmt und alle Werke zu erhalten. Als ich es auf HTTPS Handy versuchte funktioniert es überhaupt nicht !!!!! Alle Orientierungen sind total falsch! Ich bin also zu dem Schluss gekommen, dass es sich um 2 Gerätetypen handeln muss (oder mehr ... bitte nein!), Da die Drehung angibt, um wie viel Grad der Bildschirm von seiner "Standard" -Position gedreht wurde, dann haben einige Geräte eine Standardposition und andere andere. Wie kann ich über diese Standardrotation herausfinden und entsprechend in meinem Code handeln? ej: defaultOrientation = some Code if (defaultOrientation == 0) ... sonst ....

Bildschirmausrichtung Verriegelung ist außer Frage. Ziel api> = 11 Dank viel

EDIT: ich meinen Code geändert haben:

public void updateCameraDisplay(int w, int h) { 
     // set preview size and make any resize, rotate or 
     // reformatting changes here 

     Log.i("CameraPreviews", "Updating camera orientation with w=" + w 
       + " and h=" + h); 
     Parameters parameters = camera.getParameters(); 
     Display display = getActivity().getWindowManager() 
       .getDefaultDisplay(); 

     int rotation = getActivity().getResources().getConfiguration().orientation; 
     Log.i("CameraPreviews", "screen rotation is " + rotation); 
     Log.i("CameraPreviews", "display rotation is " + display.getRotation()); 
     if (display.getRotation() == Surface.ROTATION_0) { 

      if (rotation == Configuration.ORIENTATION_LANDSCAPE) { 
       parameters.setPreviewSize(h, w); 
       camera.setDisplayOrientation(0); 
      } else { 
       parameters.setPreviewSize(h, w); 
       camera.setDisplayOrientation(90); 
      } 
     } 

     else if (display.getRotation() == Surface.ROTATION_90) { 
      if (rotation == Configuration.ORIENTATION_PORTRAIT) { 
       parameters.setPreviewSize(w, h); 
       camera.setDisplayOrientation(270); 
      } else { 
       parameters.setPreviewSize(w, h); 
       //camera.setDisplayOrientation(0); 
      } 
     } 

     else if (display.getRotation() == Surface.ROTATION_180) { 
      if (rotation == Configuration.ORIENTATION_LANDSCAPE) { 
      parameters.setPreviewSize(h, w); 
      camera.setDisplayOrientation(180); 
      }else { 
       parameters.setPreviewSize(h, w); 
       camera.setDisplayOrientation(270); 
      } 
     } 

     else if (display.getRotation() == Surface.ROTATION_270) { 
      if (rotation == Configuration.ORIENTATION_PORTRAIT) { 
       parameters.setPreviewSize(w, h); 
       camera.setDisplayOrientation(90); 
      } else { 
       parameters.setPreviewSize(w, h); 
       camera.setDisplayOrientation(180); 
      } 
     } 

     try { 
      camera.setParameters(parameters); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

funktioniert besser auf HTC One S und Samsung Galaxy Tab, solange wir nicht drehen die Telefon im Portrait-Modus auf den Kopf gestellt

+1

Ich denke, für die richtige Umsetzung müssen Sie auch Gerätehöhe/-breite berechnen ... Mit der Kombination von Winkel und Gerät aktuelle Höhe/Breite können Sie genaue Position ermitteln – dreamcoder

+0

Verwenden Sie ExifInterface, um die Ausrichtung ..it funktioniert gut für mich, aber ich habe meinen Code in keinem HTC-Gerät getestet. – Biplab

+0

2 Gerätetypen: http://stackoverflow.com/a/35431231/192373 –

Antwort

0

Die Faktoren, über die Sie nachdenken müssen, sind: die Ausrichtung des Geräts, der Grad zwischen dem Bildschirm und der Kamera, vorausgesetzt, Sie verwenden die rückseitige Kamera und ob Sie die Aktivität aktivieren spüren Sie die Orientierungsänderung.

Und eine wichtige Sache ist, ob der vom Hersteller implementierte Camera HAL-Code dem Google-Protokoll entspricht.

Verwandte Themen