2012-04-28 9 views
1

Я реализую свою собственную работу с камерой. Чтобы повернуть захваченное изображение, мне нужно знать ориентацию во время съемки. Есть ли более высокий уровень API для датчика значения крена и тангажа, что говорит мне мое устройство ориентировано на:

сверху вниз - держа телефон нормальный, портрет
вниз-вверх
вправо-влево - пейзаж сверху телефона находится справа.
left-right - landscape наверху телефона находится на левой сторонеAPI более высокого уровня для значений датчиков Шаг и ролл

Или есть ли другой способ передать его непосредственно из системы?

+0

Что вы подразумеваете под сверху вниз, .. левый-правый? – zapl

+0

Вы можете просто написать функцию, которая проверяет это и называет ее всякий раз, когда вам нужно. Кроме того, вы должны принять ответы, если хотите, чтобы люди ответили на ваши вопросы. Взгляните на свои старые ответы и примите самые лучшие. Кнопка находится в рейтинге ответов. –

+0

спасибо за это советую, я смотрю на эту функцию – strangeoptics

ответ

1

К сожалению, камеры работают на странном пути на андроиде, когда они не находятся в ландшафтном режиме (что является «естественной» ориентацией для камеры на андроиде).

Лучшее, что нужно сделать, - установить активность в ландшафтном режиме и добавить событие onConfigurationChanged (а также добавить android: configChanges = "orientation" в манифест), чтобы получить текущую ориентацию.

при захвате изображения, проверьте ориентацию и действуйте в соответствии с любой логикой, которую вы хотите иметь.

+0

Хорошая точка. Я не знал, что существует нечто вроде события onConfigurationChanged. Я попробовал, и это может только сказать мне, если я в портретном или ландшафтном режиме. Датчик камеры имеет одно направление, но у ландшафта может быть два, когда я добираю камеру вправо или влево. Мне нужен способ определить, как мне повернуть результат. – strangeoptics

+0

, если вы нацелились на 2.2+, вам может быть повезло с этим: http: //developer.android.com/reference/android/view/Display.html#getRotation%28%29 –

+0

Еще один хороший кусочек API, который я не слышал of;) Я попробовал, но он показывает мне всегда 0 градусов. int rotation = getWindowManager(). getDefaultDisplay(). getRotation(); Maybee это потому, что я установил ориентацию, зафиксированную в манифесте. – strangeoptics

1

Хорошо, решил мою проблему до определенного момента, чтобы она работала для меня, и я не учитывал нижестоящее признание.

public class DeviceOrientation { 

public static final int ORIENTATION_PORTRAIT = 0; 
public static final int ORIENTATION_LANDSCAPE_REVERSE = 1; 
public static final int ORIENTATION_LANDSCAPE = 2; 
public static final int ORIENTATION_PORTRAIT_REVERSE = 3; 

int smoothness = 1; 
public float averagePitch = 0; 
public float averageRoll = 0; 
public int orientation = ORIENTATION_PORTRAIT; 

private float[] pitches; 
private float[] rolls; 

public DeviceOrientation(int smoothness) { 
    this.smoothness = smoothness; 

    pitches = new float[smoothness]; 
    rolls = new float[smoothness]; 
} 

public void addSensorEvent(SensorEvent event) { 
    azimuth = event.values[0]; 

    averagePitch = addValue(event.values[1], pitches); 
    averageRoll = addValue(event.values[2], rolls); 

    orientation = calculateOrientation(); 
} 

private float addValue(float value, float[] values) { 
    float average = 0; 

    for(int i=1; i<smoothness; i++) { 
     values[i-1] = values[i]; 
     average += values[i]; 
    } 
    values[smoothness-1] = value; 
    average = (average + value)/smoothness; 

    return average; 
} 

/** handles all 4 possible positions perfectly */ 
private int calculateOrientation() { 
    // finding local orientation dip 
    if (((orientation == ORIENTATION_PORTRAIT || orientation == ORIENTATION_PORTRAIT_REVERSE) 
      && (averageRoll > -30 && averageRoll < 30))) { 
     if (averagePitch > 0) 
      return ORIENTATION_PORTRAIT_REVERSE; 
     else 
      return ORIENTATION_PORTRAIT; 
    } else { 
     // divides between all orientations 
     if (Math.abs(averagePitch) >= 30) { 
      if (averagePitch > 0) 
       return ORIENTATION_PORTRAIT_REVERSE; 
      else 
       return ORIENTATION_PORTRAIT; 
     } else { 
       if (averageRoll > 0) { 
        return ORIENTATION_LANDSCAPE_REVERSE; 
       } else { 
        return ORIENTATION_LANDSCAPE; 
       } 
     } 
    } 
} 

Объяснение: Если я в портретном режиме и tillt на мобил вперед, пока она не находится в горизонтальном положении, было бы переключиться на пейзаж за счет остальной части кода. Поэтому я проверяю, находится ли он в портрете и затрудняет условия для этого режима. Это то, что я считаю местным провалом. Остальное просто делится на все 3 направления.

Одна вещь - это плохо. Если устройство находится в landscape_x и получает несколько градусов назад, пик перескакивает от ~ 2 до ~ 175. В этот момент мой код переворачивается между пейзажем и портретом.

Гладкость сгладит значение данных датчика, объединив последние значения n и вычислив среднее значение. Это не обязательно.

Надеюсь, это поможет другим. Если вы можете улучшить код дальше, пожалуйста, дайте мне знать.

+0

любезно оставьте остальную часть кода ... пожалуйста? –

+0

Код обновлен. Полный проект, чтобы играть с ним, находится на моем диске Google. [SensorDemo.rar] (https://docs.google.com/open?id=0B4dC-qLD0ltec3BteVNBTDB2OFU) – strangeoptics

+0

спасибо. что вы имели в виду под «Не идеально, но работает 95%»? –