47 votes

Comment vérifier l'orientation naturelle (par défaut) de l'appareil sur Android (c.-à-d. Obtenir un paysage, par exemple, Motorola Charm ou Flipout)

J'ai une activité montrant un aperçu de la caméra, elle doit donc être définie comme paysage uniquement. En bas (quelle que soit la rotation du périphérique), je souhaite afficher une vue de texte. J'utilise OrientationEventListener qui donne l'orientation de l'appareil à partir de sa position naturelle. Je peux mettre en œuvre une solution qui fonctionne bien sur les périphériques portrait par défaut, mais pour que cela fonctionne également sur les périphériques par défaut en mode paysage, je dois être conscient de l’exécution sur un tel périphérique. La question est donc comment le vérifier?

78voto

user1035292 Points 407

Cette méthode peut aider: -

 public int getDeviceDefaultOrientation() {

    WindowManager windowManager =  (WindowManager) getSystemService(WINDOW_SERVICE);

    Configuration config = getResources().getConfiguration();

    int rotation = windowManager.getDefaultDisplay().getRotation();

    if ( ((rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) &&
            config.orientation == Configuration.ORIENTATION_LANDSCAPE)
        || ((rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) &&    
            config.orientation == Configuration.ORIENTATION_PORTRAIT)) {
      return Configuration.ORIENTATION_LANDSCAPE;
    } else { 
      return Configuration.ORIENTATION_PORTRAIT;
    }
}
 

12voto

Nanne Points 35880

Eh bien, vous pouvez découvrir ce que l'orientation actuelle est la façon @Urboss dit. Vous ne pouvez pas obtenir la mise en page (portrait/paysage) de cette façon, bien sûr, de sorte que vous aurez à obtenir la largeur de l'écran/hauteur de vérifier si le courant (être il a changé ou pas, mais vous avez vérifié que ;) ) est en position paysage ou portrait:

    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    wPix = dm.widthPixels;
    hPix = dm.heightPixels;

(donc, si la rotation est de 0, et vous obtenez paysage au-dessus de metrix, votre appareil est par défaut paysage. Si la rotation est de 90 degrés et vous êtes portrait, la valeur par défaut est également le paysage, et ainsi de suite)

9voto

Andi Jay Points 1166

Après des heures et des heures à essayer de comprendre cela. Il n'est pas possible. Cependant, la chose la plus proche que vous pouvez faire est de définir l'orientation de "NOSENSOR"

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

Ce que cela va faire est de configurer votre application à l'orientation naturelle de l'appareil. À ce stade, vous pouvez obtenir la hauteur et la largeur de l'écran à l'aide de la DisplayMetrics classe, et de calculer si vous êtes en mode paysage ou portrait. Après vous ensuite de voir si il est en mode paysage ou portrait, vous pouvez le faire

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_XXXXX);

Où XXXX est soit en mode PAYSAGE ou PORTRAIT.

Au cas où cela peut ne pas fonctionner si vous avez un clavier coulissant.

7voto

radhoo Points 1185

Grâce à l'excellente réponse du diyisme ci-dessus, j'ai également ajouté la logique permettant de vérifier la position d'orientation réelle (paysage à droite, portrait, paysage à gauche, portrait retourné): entrez la description de l'image ici Voici le code:

 @Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
    //The coordinate-system is defined relative to the screen of the phone in its default orientation
    int orientation = 0;
    float roll=0;
    float pitch=0;
    switch (getWindowManager().getDefaultDisplay().getRotation())  {
        case Surface.ROTATION_0:
                 roll=event.values[2];
                 pitch=event.values[1];
            break;
            case Surface.ROTATION_90:
                 roll=event.values[1];
                 pitch=-event.values[2];
            break;
            case Surface.ROTATION_180:
                 roll=-event.values[2];
                 pitch=-event.values[1];
            break;
            case Surface.ROTATION_270:
                 roll=-event.values[1];
                 pitch=event.values[2];
            break;
           }

    if (pitch >= -45 && pitch < 45 && roll >= 45)
        orientation = 0;
    else if (pitch < -45 && roll >= -45 && roll < 45) 
        orientation = 1; 
    else if (pitch >= -45 && pitch < 45 && roll < -45) 
        orientation = 2;
    else if (pitch >= 45 && roll >= -45 && roll < 45 ) 
        orientation = 3;

    if (m_nOrientation != orientation) { //orientation changed event
        m_Inst.Debug(LOG_TAG,"onSensorChanged: orientation:" + orientation);
        m_nOrientation = orientation;
        // fire event for new notification, or update your interface here
    }
}
 

Ce code est également publié ici: http://www.pocketmagic.net/?p=2847

6voto

user931289 Points 86

Voici ma solution:

 public class ActivityOrientationTest extends Activity {
private static final String TAG = "ActivityOrientationTest";
private int mNaturalOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
private TextView mTextView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);        
    setContentView(R.layout.main);
    mTextView = (TextView)findViewById(R.id.text);
    setDefaultOrientation();        
}

private void setDefaultOrientation(){
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);

    Display display;         
    display = getWindow().getWindowManager().getDefaultDisplay();
    int rotation = display.getRotation();
    int width = 0;
    int height = 0;
    switch (rotation) {
    case Surface.ROTATION_0:
    case Surface.ROTATION_180:
        Log.i(TAG, "Rotation is: 0 or 180");
        width = display.getWidth();
        height = display.getHeight();
        break;
    case Surface.ROTATION_90:       
    case Surface.ROTATION_270:
        Log.i(TAG, "Rotation is: 90 or 270");
        width = display.getHeight();
        height = display.getWidth();
        break;
    default:
        break;
    }

    if(width > height){
        Log.i(TAG, "Natural Orientation is landscape");
        mTextView.setText("Natural Orientation is landscape");
        mNaturalOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
    } else {
        Log.i(TAG, "Natural Orientation is portrait");
        mNaturalOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
        mTextView.setText("Natural Orientation is portrait");
    } 

    setRequestedOrientation(mNaturalOrientation);
}
 

Display.getRotation () est uniquement pris en charge par les API de niveau 8 ou supérieur. Si vous devez prendre en charge des périphériques plus anciens, vous devez appeler Display.getOrientation ().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X