2016-07-22 23 views
0

Ich habe mir andere Fragen angeschaut, wo Leute das gefragt haben, aber ich war mir nicht sicher, was der beste Weg war, dieses Problem zu lösen. Nachdem ich den Android-Leitfaden zur Implementierung der Kamera gelesen habe, ist die Kameravorschau, die ich habe, in der Landschaft verankert. Ich wollte wissen, wie man die Ausrichtung der Kamera anpasst, um die Ausrichtung des Telefons zu spiegeln.Wie setze ich Kameraausrichtung in Android?

ich versucht, dieses

camera.setDisplayOrientation(90); 

Und dass die Kamera in den Portrait-Modus gesperrt, so brauche ich eine andere Lösung (vorzugsweise eine, die für die meisten Geräte funktioniert).

Auch, wie kann ich es so machen, dass das gespeicherte Bild auf die gleiche Weise wie die Vorschau angezeigt wird? Wenn ich diese Codezeile oben verwende, um die Vorschau auf Hochformat zu setzen, wird das gespeicherte Bild immer noch für eine Landschaft gedreht. Danke

Antwort

3
Camera.Parameters params= mCamera.getParameters(); 
params.set("rotation", 90); 
mCamera.setParameters(params); 
+0

Das hat nichts für mich getan – Jill

+0

müssen Sie params.set ("Rotation", 90); anstelle von setDisplayOrientation –

+0

Yup, habe ich das getan. Es hat nichts getan, während setDisplayOrientation etwas getan hatte. – Jill

0

Ich habe das mit der Google-Kamera-App behoben. Mit einem Sensor wird die Ausrichtung des Telefons ermittelt und das EXIF-Tag wird entsprechend eingestellt. Das JPEG, das aus der Kamera kommt, ist nicht automatisch ausgerichtet.

Auch die Kameravorschau funktioniert nur im Querformat einwandfrei. Wenn Sie möchten, dass Ihr Aktivitätslayout im Hochformat ausgerichtet ist, müssen Sie dies manuell tun, indem Sie den Wert des Orientierungssensors verwenden.

Ich würde empfehlen, das Foto des EXIF-Daten und suchen vor allem für

ExifInterface exif = new ExifInterface(SourceFileName); //API Level 5 
String exifOrientation = exif.getAttribute(ExifInterface.TAG_ORIENTATION); 

Kommentar hinterlassen Überprüfung und Lassen Sie mich wissen, ob das Ihnen hilft.

+0

Ich möchte keine externe App für diesen Einsatz. – Jill

+0

Eine Kameravorschau muss nicht im Querformatmodus sein. Ab Android 2.2 (API Level 8) können Sie die setDisplayOrientation() -Methode verwenden, um die Drehung des Vorschaubilds festzulegen. Um die Vorschauausrichtung zu ändern, während der Benutzer das Telefon neu ausrichtet, stoppen Sie die Vorschau mit Camera.stopPreview() zunächst in der Methode oldChanged() Ihrer Vorschauklasse, ändern Sie die Ausrichtung und starten Sie die Vorschau dann erneut mit Camera.startPreview (). –

+0

können Sie auch mehr auf https://developer.android.com/reference/android/hardware/Camera.Parameters.html#setRotation%28int%29 –

0

Sie müssen die Ausrichtung berücksichtigen, wenn Sie bestimmen, welche Vorschaugröße ausgewählt werden soll. Zum Beispiel ist die getOptimalPreviewSize() aus der CameraPreview von ApiDemos Orientierung vergessen, einfach weil ihre Version der App die Ausrichtung auf Landschaft gesperrt hat. Wenn Sie die Ausrichtung frei lassen möchten, müssen Sie das Zielseitenverhältnis umkehren, damit es übereinstimmt. Also, wo getOptimalPreviewSize() hat diese

double targetRatio=(double)width/height; 

Und

if (displayOrientation == 90 || displayOrientation == 270) { 
    targetRatio=(double)height/width; 
} 

wo displayOrientation ist ein Wert von 0 bis 360, dass ich von etwa 100 Zeilen einiger ernsthaft hässlich Code bin Bestimmung, weshalb ich bin all dies in einer wiederverwendbaren Komponente, die ich in Kürze veröffentlichen werde.

Zweitens müssen Sie die Ausrichtung des Displays berücksichtigen, wenn Sie das Bildformat des verwendeten SurfaceView/TextureView steuern. Die CameraPreview Aktivität von ApiDemos hat seine eigene Vorschau ViewGroup, die das Seitenverhältnis behandelt, und es müssen Sie das Seitenverhältnis für den Einsatz im Hochformat umgekehrt:

if (displayOrientation == 90 
     || displayOrientation == 270) { 
     previewWidth=mPreviewSize.height; 
     previewHeight=mPreviewSize.width; 
    } 
    else { 
     previewWidth=mPreviewSize.width; 
     previewHeight=mPreviewSize.height; 
    } 

wo displayOrientation ist, dass gleicher Wert (90 und 270 Portrait und mehr Reverse-Portrait, und beachten Sie, dass ich nicht versucht habe, Reverse-Portrait oder Reverse-Landscape zu arbeiten, so dass mehr Feinabstimmung erforderlich ist).

Drittens - Sie müssen die Vorschau vor dem Aufruf setPictureSize() über die Camera.Parameters starten. Ansonsten verhält es sich so, als ob das Seitenverhältnis des Bildes auf die Vorschaubilder angewendet wird und die Dinge verschraubt werden.

Camera.Parameters parameters=camera.getParameters(); 
Camera.Size pictureSize=getHost().getPictureSize(parameters); 

parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 

camera.setParameters(parameters); 
camera.startPreview(); 

parameters=camera.getParameters(); 
parameters.setPictureSize(pictureSize.width, pictureSize.height); 
parameters.setPictureFormat(ImageFormat.JPEG); 
camera.setParameters(parameters); 
+0

Wo finden Sie diese Methode getOptimalPreviewSize()? – Jill

+0

private Größe getOptimalPreviewSize (Liste Größen, int w, int h) {....} –