Эта проблема, похоже, началась как ошибка с определенным оборудованием, см. Здесь, но ее можно преодолеть, используя вызов mCamera.setDisplayOrientation (степени), доступный в API 8. Вот как я ее реализую:
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);
}
}
Это было на HTC Desire, и мне сначала пришлось вводить записи журнала в каждую проверку ротации, чтобы сказать, что это за ротация, а затем отлаживал устройство и смотрел вывод logCat, пока я вращал устройство. Для HTC Desire 0 был телефоном, как и следовало ожидать (портрет), 90 градусов поворачивал телефон на 90 градусов ПРОТИВ ЧАСОВОЙ СТРЕЛКИ (я предполагал, что это будет по часовой стрелке). В коде вы увидите, что мне не нужно было вращать дисплей, когда телефон был на 90 или 180 градусов - устройство, похоже, справилось с этим само. Только одна точка не работает должным образом: поворот на 270 градусов - это когда вы поворачиваете устройство на 90 градусов по часовой стрелке, и счетчики поворота дисплея это нормально, но если вы поворачиваете устройство на 270 градусов против часовой стрелки, кажется, что это не компенсирует это должным образом.
PS Обратите внимание на смену ширины и высоты при соответствующих поворотах.