Wydawało się, że ten problem zaczyna się jako błąd z pewnym sprzętem, patrz tutaj, ale można go rozwiązać, używając wywołania mCamera.setDisplayOrientation (stopnie) dostępnego w API 8. Tak więc implementuję to:
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);
}
}
Było to na HTC Desire i musiałem początkowo wprowadzić zapisy logowania w każdym sprawdzeniu rotacji, aby powiedzieć, jaka jest rotacja, a następnie debugowałem na urządzeniu i oglądałem wyjście logCat, gdy obracałem urządzenie. W przypadku HTC Desire, 0 był telefonem, jak można się spodziewać (portret), 90 stopni obracało telefon o 90 stopni w kierunku przeciwnym do ruchu wskazówek zegara (zakładałem, że byłby zgodny z ruchem wskazówek zegara). W kodzie zobaczysz, że nie musiałem obracać wyświetlacza, gdy telefon był ustawiony pod kątem 90 lub 180 stopni - urządzenie wydawało się radzić sobie z tym samo. Tylko jeden punkt nie działa poprawnie: obrót o 270 stopni ma miejsce, gdy obrócisz urządzenie o 90 stopni w prawo, a obrót wyświetlacza jest zgodny, ale jeśli obrócisz urządzenie o 270 stopni w lewo, wydaje się, że nie kompensuje to właściwie.
PS Zwróć uwagę na zamianę szerokości i wysokości w odpowiednich obrotach.