2010-03-30 8 views
36

Ich habe versucht verschiedene Dinge zu versuchen, um die Kamera Vorschau im Hochformat auf einem SurfaceView angezeigt zu bekommen. Nichts hat geklappt. Ich teste gerade einen Droid mit 2.0.1. Ich habe versucht:Android Kamera im Hochformat auf SurfaceView

1) zwingt das Layout von Porträt zu sein: this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

2)

Camera.Parameters parameters = camera.getParameters(); 
parameters.set("orientation", "portrait"); 
parameters.setRotation(90); 
camera.setParameters(parameters); 

mit Gibt es etwas anderes kann ich versuchen? Wenn dies ein Fehler in Android oder dem Telefon ist, wie kann ich sicherstellen, dass dies der Fall ist, so dass ich Beweise habe, um den Kunden zu informieren?

Danke, Prasanna

+0

Werfen Sie einen Blick - http://stackoverflow.com/questions/10259299/force-a-camera-to-always-open-in-portrait-mode-in-android/10259572#10259572 –

+0

kann jeder eine Hilfe http://stackoverflow.com/questions/28379130/how-to-set-camera-image-orientation –

Antwort

10

Ich habe eine funktionierende Lösung für den Hochformat-Modus in 2.1 (getestet auf Desire) vielleicht weniger.

Die Bildschirmausrichtung der Aktivität wird auf Hochformat eingestellt. (android: screenOrientation = "Portrait")

die Kameraparameter:

Camera.Parameters p = mCamera.getParameters();

p.set("jpeg-quality", 100); 
p.set("orientation", "landscape"); 
p.set("rotation", 90); 
p.setPictureFormat(PixelFormat.JPEG); 
p.setPreviewSize(h, w);// here w h are reversed 
mCamera.setParameters(p); 

und das Bild wird Porträt sein.

SurfaceHolder, den Sie für die Kamera verwenden, muss eine Größe haben, die mit der Vorschaugröße des Telefons normalerweise Bildschirmauflösung kompatibel ist.

Lustig auf Wunsch 2.2 funktioniert nicht ... Hier ist das Update:

At surfaceCreated(..) or when you have this line 
camera = Camera.open(); 
     add 
camera.setDisplayOrientation(90);//only 2.2> 

Camera.Parameters p = camera.getParameters(); 
    p.set("jpeg-quality", 100); 
p.setRotation(90); 
p.setPictureFormat(PixelFormat.JPEG); 
p.setPreviewSize(h, w); 
camera.setParameters(p); 
0

Es besteht keine Notwendigkeit Sie Parameter für die Orientierung setzen, bis Sie, dass explizit müssen tun. Standardmäßig unterstützt es diese Einrichtung. In meinem Fall habe ich eine Aktivität und oberhalb dieser Aktivität habe ich eine Kameraansicht, also habe ich keine Orientierung für die Kameraeigenschaften festgelegt, sondern für die Aktivität die Ausrichtung als Hochformat in der Manifestdatei festgelegt. jetzt sieht die App gut aus und funktioniert gut. Könnte für einige hilfreich sein ..

Danke.

61

Ab API lvl 8, das ist verfügbar:

public final Leere setDisplayOrientation (int Grad)

dh mit portait im Manifest:

public void surfaceCreated(SurfaceHolder holder) { 
    mCamera = Camera.open(); 
    mCamera.setDisplayOrientation(90); 
+12

Ich habe dies getan, aber das Byte [] Ich bekomme immer noch gibt mir ein Landschaftsfoto. – tasomaniac

+3

Set mCamera.setDisplayOrientation (90); Kamera-Ansicht Ok, aber Video-Ergebnis nicht die gleiche Kamera-Ansicht, es nicht Rotation 90. Warum? – mum

+0

Hey, Sie können dafür die Methode param.setRotation (..) verwenden. Ich versuche immer noch herauszufinden, wie es funktioniert. Es ist toll! – sunlover3

10

Sie können versuchen, diese (gut für 2.2 oder darunter). Hier drehe ich das Bild vor dem Speichern auf SD-Karte. Aber es ist nur für den Porträtmodus. Wenn Sie es für beide Modi machen mussten, sollten Sie die Kameraausrichtung überprüfen und etwas überprüfen, bevor Sie das Bild aufnehmen.

PictureCallback jpegCallback = new PictureCallback() { 
    public void onPictureTaken(byte[] data, Camera camera) { 
     FileOutputStream outStream = null; 
     try { 
     imageFilePath = getFilename(); 
     InputStream is = new ByteArrayInputStream(data); 
     Bitmap bmp = BitmapFactory.decodeStream(is); 
     // Getting width & height of the given image. 
     if (bmp != null){ 
      int w = bmp.getWidth(); 
      int h = bmp.getHeight(); 
      // Setting post rotate to 90 
      Matrix mtx = new Matrix(); 
      mtx.postRotate(90); 
      // Rotating Bitmap 
      Bitmap rotatedBMP = Bitmap.createBitmap(bmp, 0, 0, w, h, mtx, true); 
      ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
      rotatedBMP.compress(Bitmap.CompressFormat.PNG, 100, stream); 
      byte[] byteArray = stream.toByteArray(); 
      outStream = new FileOutputStream 
           (String.format(imageFilePath,System.currentTimeMillis())); 
      outStream.write(byteArray); 
      outStream.close(); 
     } else { 
      outStream = new FileOutputStream 
           (String.format(imageFilePath,System.currentTimeMillis())); 
      outStream.write(data); 
      outStream.close();   
     }  

     preview.camera.startPreview(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
    } 
    } 
}; 
+1

Dieser Code ist das Bild zu drehen, nicht die Vorschau wie gefragt. –