Esse problema parece ter começado como um bug em determinado hardware, veja aqui, mas pode ser superado usando a chamada para mCamera.setDisplayOrientation (graus) disponível na API 8. Portanto, é assim que eu o 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);
}
}
Isso acontecia no HTC Desire e eu tive que inserir instruções de registro em cada uma das verificações de rotação para dizer qual era a rotação e depois depurar no dispositivo e observar a saída do logCat enquanto eu rodava o dispositivo. Para o HTC Desire, 0 era o telefone como você esperava (retrato), 90 graus estava girando o telefone 90 graus no sentido anti-horário (eu supus que seria no sentido horário). No código, você verá que eu não precisava fazer rotação do visor quando o telefone estava a 90 ou 180 graus - o dispositivo parecia lidar com isso sozinho. Apenas um ponto não está funcionando corretamente: a rotação de 270 graus ocorre quando você gira o dispositivo 90 graus no sentido horário e a rotação do visor é ok, mas se você girar o dispositivo 270 graus no sentido anti-horário, ele não parece compensá-lo corretamente.
PS Observe a troca de largura e altura nas rotações apropriadas.