2013-02-19 14 views
7

Si potrebbe pensare che ci sarebbe una soluzione semplice. Lo stato dei documenti Android:Ottenere l'orientamento del dispositivo Android

Il sensore di orientamento era obsoleto in Android 2.2 (livello API 8). Invece di utilizzare dati grezzi dal sensore di orientamento, si consiglia di utilizzare per utilizzare il metodo getRotationMatrix() insieme al metodo getOrientation() per calcolare i valori di orientamento.

Eppure, non forniscono una soluzione su come implementare getOrientation() e getRotationMatrix(). Ho passato diverse ore a leggere i post qui sugli sviluppatori usando questi metodi, ma tutti hanno codice parzialmente incollato o qualche strana implementazione. Googling non ha fornito un tutorial. Qualcuno può incollare una soluzione semplice usando questi due metodi per generare l'orientamento ??

+0

così si desidera dispositivo c orientamento urrent? –

+0

Sì, ma deve essere indipendente dalla schermata effettiva. Un servizio dovrebbe essere in grado di determinare l'orientamento. – AndroidDev

+0

Si desidera determinare se il dispositivo è in modalità verticale o orizzontale da un servizio? –

risposta

6

ecco l'implementazione per getOrientation():

public int getscrOrientation() 
    { 
     Display getOrient = getWindowManager().getDefaultDisplay(); 

     int orientation = getOrient.getOrientation(); 

     // Sometimes you may get undefined orientation Value is 0 
     // simple logic solves the problem compare the screen 
     // X,Y Co-ordinates and determine the Orientation in such cases 
     if(orientation==Configuration.ORIENTATION_UNDEFINED){ 

      Configuration config = getResources().getConfiguration(); 
      orientation = config.orientation; 

      if(orientation==Configuration.ORIENTATION_UNDEFINED){ 
       //if height and widht of screen are equal then 
       // it is square orientation 
       if(getOrient.getWidth()==getOrient.getHeight()){ 
        orientation = Configuration.ORIENTATION_SQUARE; 
       }else{ //if widht is less than height than it is portrait 
        if(getOrient.getWidth() < getOrient.getHeight()){ 
         orientation = Configuration.ORIENTATION_PORTRAIT; 
        }else{ // if it is not any of the above it will defineitly be landscape 
         orientation = Configuration.ORIENTATION_LANDSCAPE; 
        } 
       } 
      } 
     } 
     return orientation; // return value 1 is portrait and 2 is Landscape Mode 
    } 

E u può anche fare riferimento questo esempio che rappresentano l'utilizzo di entrambi i metodi:

 getOrientation and getRotationMatrix 

http://www.codingforandroid.com/2011/01/using-orientation-sensors-simple.html

+0

Questo ha l'orientamento dello schermo che uso già nel codice. Non credo che sia la stessa cosa che ottenere l'orientamento del dispositivo basato sui sensori. In effetti, l'ho provato anche in passato e non funzionerà all'interno di un servizio senza schermo. I servizi di solito non accedono allo schermo e dovrebbero essere in grado di determinare l'orientamento del dispositivo dai sensori. Sono richiesti getOrientation e getRotationMatrix. – AndroidDev

+0

L'ho provato ma non dà i risultati come ci si aspetterebbe. Ho appena scaricato un'app dall'app store che mostra tutti i sensori sul dispositivo e come funzionano. Uno è chiamato sensore di orientamento e quando lo si utilizza, l'app mostra come funziona correttamente il sensore. I valori non dovrebbero cambiare (o cambiare molto poco) quando non si sposta il dispositivo. Il codice nel link sopra non fornisce risultati affidabili ma i valori saltano dappertutto. – AndroidDev

+0

Sto iniziando a pensare che forse inserire un breakpoint e correre in modalità di debug potrebbe influenzare il modo in cui i sensori vengono letti. Cercherò di eseguirlo senza eseguire il debug e visualizzare i valori man mano che vengono aggiornati e vedere cosa succede. – AndroidDev

4
public int getScreenOrientation() { 


// Query what the orientation currently really is. 
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)    { 
    return 1; // Portrait Mode 

}else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { 
    return 2; // Landscape mode 
} 
return 0; 
} 
2
protected void onResume() { 
    // change the screen orientation 
    if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { 
     setContentView(R.layout.portrait); 
    } else if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { 
     setContentView(R.layout.landscape); 
    } else { 
     setContentView(R.layout.oops); 
    } 
} 
Problemi correlati