страница документации для 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 °, что не это действительно имеет смысл для меня.
Итак, вопрос: действительно ли образец неверен или я что-то упустил? Я пробовал его на нескольких устройствах, как с основной, так и с фронтальной камерой и во всех поддерживаемых ориентациях, поэтому я знаю, что мой код ПРАВИЛЬНЫЙ. работающий. Стоит упомянуть одну маленькую деталь: все мои устройства вернули 90° как info.orientation
.
EDIT: Вот мой код, связанный с камерой, я протестировал его на Nexus One. и Samsung Galaxy S Plus. Он используется в моем 3D-приложении для отслеживания головы, предварительный просмотр отображается в левом нижнем углу и всегда должен иметь правильную ориентацию.
РЕШЕНИЕ (вроде): Похоже, что код правильный, но мой тестовый телефон (Samsung Galaxy S Plus) возвращает неверное значение CameraInfo.orientation передней камеры. Существует множество связанных дискуссий по поводу отображения предварительного просмотра в перевернутом виде на этой модели (примеры здесь и здесь). Способ исправить это включить опцию ручного поворота изображения.