Подтвердить что ты не робот

Как проверить естественную ориентацию устройства (по умолчанию) на Android (т.е. Получить пейзаж, например, Motorola Charm или Flipout)

У меня есть активность, показывающая предварительный просмотр с камеры, поэтому ее нужно установить только как пейзаж. В нижней части (независимо от поворота устройства) я хочу показать текстовое представление. Я использую OrientationEventListener, который дает ориентацию устройства из его естественного положения. Я могу реализовать решение, которое хорошо работает на устройствах с портретом по умолчанию, но чтобы заставить его работать и на ландшафтных устройствах по умолчанию, мне нужно знать о запуске на таком устройстве. Таким образом, вопрос заключается в том, как проверить это?

4b9b3361

Ответ 2

Этот метод может помочь: -

public int getDeviceDefaultOrientation() {

    WindowManager windowManager =  (WindowManager) getSystemService(Context.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;
    }
}

Ответ 3

Ну, вы можете узнать, какая текущая ориентация - это то, как сказал @Urboss. Вы не можете получить макет (пейзаж/портрет) таким образом, конечно, вам нужно будет получить ширину/высоту экрана, чтобы проверить, является ли текущий (изменился или нет, но вы это проверили;)) позиция - пейзаж или портрет:

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

(поэтому, если поворот равен 0, и вы получаете пейзаж с вышеуказанной метрикой, ваше устройство по умолчанию имеет пейзаж. Если поворот на 90 градусов, а вы - портрет, по умолчанию также пейзаж и т.д.)

Ответ 4

Спустя часы и часы, пытаясь понять это. Это невозможно. Однако самое близкое, что вы можете сделать, это установить ориентацию на "NOSENSOR"

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

Что это будет делать, это настроить приложение на естественную ориентацию устройства. На этом этапе вы можете получить высоту и ширину дисплея с помощью класса DisplayMetrics и рассчитать, находитесь ли вы в пейзаже или на портрете. После того, как вы выясните, пейзаж или портрет, вы можете сделать это

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_XXXXX);

Где XXXX - ЛАНДШАФТ или ПОРТРЕТ.

Случай, когда это может не работать, - это если вы используете слайд-клавиатуру.

Ответ 5

Благодаря превосходному ответу diyism, я добавил логику, чтобы проверить фактическое положение ориентации (пейзаж справа, портрет, пейзаж слева, портрет перевернулся): enter image description here Вот код:

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

Этот код также размещен здесь: http://www.pocketmagic.net/?p=2847

Ответ 6

Здесь мое решение:

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() поддерживается только в уровне API 8 или выше, поэтому, если вам нужно поддерживать более старые устройства, вам нужно вызвать Display.getOrientation().

Ответ 7

public static boolean isDeviceDefaultOrientationLandscape(Activity a) {

    WindowManager windowManager = (WindowManager) a.getSystemService(Context.WINDOW_SERVICE);

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

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

    boolean defaultLandsacpeAndIsInLandscape = (rotation == Surface.ROTATION_0 ||
            rotation == Surface.ROTATION_180) &&
            config.orientation == Configuration.ORIENTATION_LANDSCAPE;

    boolean defaultLandscapeAndIsInPortrait = (rotation == Surface.ROTATION_90 ||
            rotation == Surface.ROTATION_270) &&
            config.orientation == Configuration.ORIENTATION_PORTRAIT;

    return defaultLandsacpeAndIsInLandscape || defaultLandscapeAndIsInPortrait;
}

Ответ 8

@Urboss, он не может. Сначала вам нужно знать ориентацию устройства по умолчанию, потому что оба метода возвращают изменения, основанные на нем (я имею в виду, если по умолчанию является портрет, то результат, который вы ищете, будет 1 или ROTATE_90, так как это пейзаж, но, если по умолчанию пейзаж, результат равен 0).

И насколько я знаю, поиск ориентации устройства по умолчанию не является тривиальным: (

Кто-нибудь может пролить свет на эту тему?

Ответ 10

Мое решение (проверено на HTC желание и SamSung galaxy tab 10.1):

    private class compass_listener implements SensorEventListener
            {public void onAccuracyChanged(Sensor sensor, int accuracy) {}

             public void onSensorChanged(SensorEvent event)
                    {float roll=0;
                     float pitch=0;
                     switch (((Activity)context).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;
                            }
                     JSONObject json=new JSONObject();
                     try
                         {json.put("roll", roll);
                          json.put("pitch", pitch);
                          json.put("azimuth", event.values[0]);
                         }
                     catch (JSONException e)
                           {throw new RuntimeException(e);
                           }
                     java_2_js(webview, "intent_compass_change", json);
                    }
            }

Ответ 11

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

private boolean isDefaultLandscape(final Context context)
{
    Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
    int rotation = display.getRotation();
    int orientation = context.getResources().getConfiguration().orientation;

    switch (rotation)
    {
        case Surface.ROTATION_180:
        case Surface.ROTATION_0:
        {
            return orientation == Configuration.ORIENTATION_LANDSCAPE;
        }
        default:
        {
            return orientation == Configuration.ORIENTATION_PORTRAIT;
        }
    }
}

Ответ 12

его очень просто решить этот

int orient = this.getResources(). getConfiguration(). ориентация;

если он возвращает 1 или 2

1 - портрет 2 - пейзаж