Страница для Camera.setDisplayOrientation содержит следующий пример кода, в котором говорится, что использование этого параметра "сделает изображение камеры в той же ориентации, что и дисплей":
public static void setCameraDisplayOrientation(Activity activity,
int cameraId, android.hardware.Camera camera) {
android.hardware.Camera.CameraInfo info =
new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(cameraId, info);
int rotation = activity.getWindowManager().getDefaultDisplay()
.getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0: degrees = 0; break;
case Surface.ROTATION_90: degrees = 90; break;
case Surface.ROTATION_180: degrees = 180; break;
case Surface.ROTATION_270: degrees = 270; break;
}
int result;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360; // compensate the mirror
} else { // back-facing
result = (info.orientation - degrees + 360) % 360;
}
camera.setDisplayOrientation(result);
}
Однако у меня были проблемы с его использованием, иногда изображение выглядело с ног на голову. После некоторой пробной ошибки я обнаружил, что правильный код будет (заменяем последние 8 строк метода):
int result = (360 + info.orientation - degrees) % 360;
camera.setDisplayOrientation(result);
(Это означает, что расчет для обратных камер также подходит для фронтальных камер). Комментарий "компенсировать зеркало" немного странный, поскольку зеркалирование не может быть отменено путем вращения, эта операция сворачивает только повороты на 90 ° и 270 ° что на самом деле не имеет смысла для меня.
Итак, вопрос: действительно ли образец неправильный или я что-то не хватает? Я пробовал его на нескольких устройствах, как на задних, так и на фронтальных камерах и на всех поддерживаемых ориентациях, поэтому я знаю, что мой код IS за работой. Одна маленькая деталь, о которой стоит упомянуть: все мои устройства вернулись на 90 ° как info.orientation
.
EDIT: Здесь - мой код, связанный с камерой, я протестировал его на Nexus One и Samsung Galaxy S Plus. Он используется в моем 3D-приложении для отслеживания головы, предварительный просмотр показан в левом нижнем углу и всегда должен иметь правильную ориентацию.
РЕШЕНИЕ (вроде): Похоже, что код верен, но мой тестовый телефон (Samsung Galaxy S Plus) возвращает неверное значение для передней камеры CameraInfo.orientation. Существует много связанных дискуссий о том, что предварительный просмотр отображается вверх дном на этой модели (примеры здесь и здесь). Способ исправления состоит в том, чтобы включить возможность поворота изображения вручную.