Ця проблема, як видається, починається як помилка з певним обладнанням, дивіться тут, але її можна подолати за допомогою виклику 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 Зверніть увагу на заміну ширини та висоти у відповідних обертах.