2012-06-28 16 views
5

devo rilevare android modifica dell'orientamento dispositivo senza giocare manualmente con i dati del sensore, mantenendo bastone orientamento attività da qualche orientamentoRilevamento orientamento del dispositivo

onConfigurationChange non funzionerà come attaccherà mia attività da non ruotare.

Giocare in giro con i dati del sensore per rilevare il cambiamento di orientamento. Ritengo che sia un'invenzione della ruota, poiché Android ha già implementato l'algoritmo per rilevare i cambiamenti di orientamento del dispositivo. E da un altro lato il rilevamento del cambiamento di orientamento non è un semplice controllo come questo.

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; 
     } 
    } 

Richiede davvero un'elaborazione dei dati reale come la filtrazione dal rumore e scosse/rotazioni improvvise brevi.

Quindi qualche idea su come l'orientamento del dispositivo può essere rilevato utilizzando i servizi legacy? (Ancora una volta, attaccherò la mia attività ad un certo orientamento in modo che onConfigurationChange non funzioni)

+0

è questo ciò si voleva ??? http://stackoverflow.com/questions/2795833/check-orientation-on-android-phone –

+0

no, non ho alcuna risorsa da modificare – deimus

risposta

8

C'è un listener per l'evento di orientamento.

Check the document here.

SO question mentioning implementation of that Listener.

Code Example for the same here in this blog

Spero che questo vi aiuterà a

+0

Grazie all'uomo è esattamente quello di cui avevo bisogno !!! rispetto !!! Sono un nuovo androide ma sembra che molti sviluppatori di android non ne siano a conoscenza anche qui in StackOverflow – deimus

+0

Benvenuto Deimus, nessuno è perfetto, ognuno ha il proprio dominio di competenza, sono appena iniziato SO uso negli ultimi 3- 5 giorni :) Happy coading – rajpara

5

La mia attività è impostato per essere sempre in modalità verticale. Metti questo codice su Crea.

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

Questo mi ha aiutato molto. Quando l'attività è bloccata su un orientamento, ma hai ancora bisogno di ottenere la posizione del dispositivo, questo è il modo giusto :) – Tooroop

5

Impostando screenOrientation proprietà nel Manifesto non sarà in grado di ottenere il valore orientamento da onConfigurationChanged più come sarebbe smettere di sparare, è possibile implementare SensorEventListener per ottenere Pitch, roll e yaw angoli per calcolare l'orientamento, ma è un po 'complicato e eccessivo per un simile compito. La soluzione migliore che ho trovato è quello di utilizzare OrientationEventListener, il codice seguente aggiornerà valore di rotazione sul cambiamento di orientamento, il valore è 0 a 4 secondo l'angolo di rotazione:

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(); 
} 
Problemi correlati