Este problema parece comenzar como un error con cierto hardware, vea aquí, pero puede superarse mediante el uso de la llamada a mCamera.setDisplayOrientation (grados) disponible en la API 8. Entonces, así es como lo implemento:
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
if (isPreviewRunning) {
mCamera.stopPreview();
}
Parameters parameters = mCamera.getParameters();
Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
if(display.getRotation() == Surface.ROTATION_0) {
parameters.setPreviewSize(height, width);
mCamera.setDisplayOrientation(90);
}
if(display.getRotation() == Surface.ROTATION_90) {
parameters.setPreviewSize(width, height);
}
if(display.getRotation() == Surface.ROTATION_180) {
parameters.setPreviewSize(height, width);
}
if(display.getRotation() == Surface.ROTATION_270) {
parameters.setPreviewSize(width, height);
mCamera.setDisplayOrientation(180);
}
mCamera.setParameters(parameters);
previewCamera();
}
And the previewCamera method :
public void previewCamera() {
try {
mCamera.setPreviewDisplay(mSurfaceHolder);
mCamera.startPreview();
isPreviewRunning = true;
} catch(Exception e) {
Log.d(APP_CLASS, "Cannot start preview", e);
}
}
Esto estaba en un HTC Desire y tuve que poner inicialmente declaraciones de registro en cada una de las comprobaciones de rotación para decir cuál era la rotación y luego depurar en el dispositivo y observar la salida de logCat mientras giraba el dispositivo. Para el HTC Desire, 0 era el teléfono como era de esperar (retrato), 90 grados giraba el teléfono 90 grados en sentido contrario a las agujas del reloj (supuse que habría sido en el sentido de las agujas del reloj). En el código que verá, no necesitaba hacer ninguna rotación de pantalla cuando el teléfono estaba a 90 o 180 grados; el dispositivo parecía manejar esto por sí mismo. Solo un punto no funciona correctamente: la rotación de 270 grados es cuando gira el dispositivo 90 grados en el sentido de las agujas del reloj y la rotación de la pantalla muestra que está bien, pero si gira el dispositivo 270 grados en sentido contrario a las agujas del reloj, no parece compensarlo correctamente.
PD Tenga en cuenta el swapover de ancho y alto en las rotaciones apropiadas.