2012-06-28 24 views
5

muszę wykryć android zmiany orientacji urządzenia bez grania ręcznie z danych z czujników, przy zachowaniu orientacji aktywność kij do jakiejś orientacjiWykrywanie orientacji urządzenia

onConfigurationChange nie zadziała jak będzie trzymać mojej działalności nie obracać.

Zabawa z danymi czujnika do wykrywania zmiany orientacji Uważam, że jako wynalazek koła, jak Android już ma wbudowaną implementację algorytmu do wykrywania zmiany orientacji urządzenia. A z drugiej strony wykrywanie zmiany orientacji nie jest prostą kontrolą jak ta.

public void onSensorChanged(SensorEvent event) { 
     if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER || event.values.length < 3) { 
      return; 
     } 
     //getResources().getConfiguration().orientation; 
     if (event.values[1] < 6.5 && event.values[1] > -6.5) { 
      if (orientation!=1) { 
       Log.d("Sensor", "Protrait"); 
      } 
      orientation=1; 
     } else { 
      if (orientation!=0) { 
       Log.d("Sensor", "Landscape"); 
      } 
      orientation=0; 
     } 
    } 

To naprawdę nie wymaga prawdziwego przetwarzania danych jak filtracja przed hałasem i nagłymi krótkich trzęsie/obrotów.

Jakie są więc pomysły na to, w jaki sposób orientacja urządzenia może zostać wykryta przy użyciu starszych usług? (Ponownie aktywuję moją działalność w pewnym kierunku, aby nie zadziałało)

+0

jest to nie to, czego chciał ??? http://stackoverflow.com/questions/2795833/check-orientation-on-android-phone –

+0

nie, nie mam żadnych zasobów do zmiany – deimus

Odpowiedz

8

Istnieje odbiornik dla zdarzenia orientacji.

Check the document here.

SO question mentioning implementation of that Listener.

Code Example for the same here in this blog

Mam nadzieję, że to pomoże Ci

+0

Dzięki temu człowiekowi to jest dokładnie to, czego potrzebowałem !!! Poszanowanie !!! Jestem nowym androidem, ale wygląda na to, że wielu android-developerów nie wie o tym nawet tutaj w stackoverflow – deimus

+0

Witaj Deimus, Nikt nie jest doskonały, każdy ma swoją własną domenę wiedzy, dopiero zaczynam używać SO przez ostatnie 3 lata 5 dni :) Happy coading – rajpara

5

Moja aktywność jest ustawiony, aby zawsze być w trybie pionowym. Wpisz ten kod na Utwórz.

myOrientationEventListener = new OrientationEventListener(this,SensorManager.SENSOR_DELAY_NORMAL) { 
     public void onOrientationChanged(int arg0) { 
      if (arg0>=315 || arg0<45){ 
       currentOrientation = Surface.ROTATION_90; 
      }else if (arg0>=45 && arg0<135){ 
       currentOrientation = Surface.ROTATION_180; 
      }else if (arg0>=135 && arg0<225){ 
       currentOrientation = Surface.ROTATION_270; 
      }else if (arg0>=225 && arg0<315){ 
       currentOrientation = Surface.ROTATION_0; 
      } 
     } 
    }; 
+0

Bardzo mi to pomogło. Kiedy Aktywność jest zablokowana na orientację, ale nadal potrzebujesz pozycji urządzenia get, to jest właściwa droga :) – Tooroop

5

Ustawiając screenOrientation nieruchomości w jawnym nie będzie w stanie uzyskać wartość orientacyjną z onConfigurationChanged już jak to zatrzymać ostrzał, to jest możliwe do wykonania SensorEventListener uzyskać Pitch, roll i yaw kąty do obliczenia orientacji, ale to trochę skomplikowane i przesada dla takiego zadania. Najlepszym rozwiązaniem znalazłem jest użycie OrientationEventListener poniższy kod zaktualizuje wartość obrotów na zmianę orientacji, wartość wynosi od 0 do 4 w zależności od kąta obrotu:

private OrientationEventListener listener; 
private int rotation; 

@Override 
protected void onCreate (Bundle savedInstanceState) 
{ 
    super.onCreate (savedInstanceState); 
    setContentView (R.layout.main); 

    listener = new OrientationEventListener (this, SensorManager.SENSOR_DELAY_NORMAL) 
    { 
     @Override 
     public void onOrientationChanged (int orientation) 
     { 
      rotation = ((orientation + 45)/90) % 4; 
     } 
    }; 

    if (myOrientationEventListener.canDetectOrientation()) listener.enable(); 
    else listener = null; // Orientation detection not supported 
} 

@Override 
protected void onDestroy() 
{ 
    super.onDestroy(); 
    if (listener != null) listener.disable(); 
}