Ориентация устройства Android альбомная, но датчики ведут себя так, как будто ориентация портретная

У меня проблема с ориентацией в андроиде. Ориентация устройства — альбомная, которую я установил в файле AndroidManifest.xml.

android:screenOrientation="landscape"

Также я держу устройство в ландшафтном режиме, поэтому все (макеты, виды и т. Д.) В ландшафтном режиме, как я и хотел. Но только когда я держу устройство в портретной ориентации, оно дает мне нужные мне значения.

Я изменил код из Интернета, и он работает на HTC 3d EVO, Nexus 7 и Samsung Galaxy S3, но не на Galaxy Tablet 10".

Я нашел этот пост. Датчик ориентации Android отличается для разных устройств? Принятый ответ предлагает использовать getRotation () и remapCoordinateSystem(), но не упоминает, как это сделать.

Вот так я кончил.

        SensorManager.getRotationMatrix(Rmat, Imat, gData, mData);
        SensorManager.remapCoordinateSystem(Rmat, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, R2);
        // Orientation isn't as useful as a rotation matrix, but
        // we'll show it here anyway.
        SensorManager.getOrientation(R2, orientation);
        float incl = SensorManager.getInclination(Imat);

        FontTextView pitchText = (FontTextView)findViewById(R.id.pitch_text);

        if((int)(orientation[1]*90) <= -110 && !newQuestionIsActive) {
            newQuestionIsActive = true;
            pitchText.setText("Bring new question");
        }
        else if(Math.abs((int)(orientation[2]*90)) <= 200 && (int)(orientation[1]*90) >= -30 && newQuestionIsActive) {
            newQuestionIsActive = false;
            pitchText.setText("Not Correct!");
        }
        else if(Math.abs((int)(orientation[2]*90)) > 200 && (int)(orientation[1]*90) >= -30 && newQuestionIsActive) {
            newQuestionIsActive = false;
            pitchText.setText("Congratulations!");
        }

Теперь, как я должен использовать getRotation() в этом коде? И, возможно, было бы полезно краткое объяснение, почему эти 3 устройства работают нормально, но не Galaxy Tablet.

Об этой проблеме говорит документация Android;

Наконец, если ваше приложение сопоставляет данные датчика с изображением на экране, вам нужно использовать метод getRotation() для определения поворота экрана, а затем использовать метод remapCoordinateSystem() для сопоставления координат датчика с координатами экрана. Вам нужно сделать это, даже если в вашем манифесте указано отображение только в книжной ориентации.

http://android-developers.blogspot.com/2010/09/one-screen-turn-deserves-another.html


person gurkan    schedule 26.06.2013    source источник


Ответы (2)


Решение найдено.

Проблема вызвана тем, что на некоторых новых устройствах по умолчанию установлена ​​альбомная ориентация, а на других — портретная. Таким образом, диспетчер датчиков ведет себя соответственно. Чтобы диспетчер датчиков работал так, как вы ожидаете, вам необходимо определить значение defaultDisplayRotation устройства и изменить логику параметра remapCoordinateSystem().

я изменился

SensorManager.remapCoordinateSystem(Rmat, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, R2);

to

int rotation = ((WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
if(rotation == 0) // Default display rotation is portrait
    SensorManager.remapCoordinateSystem(Rmat, SensorManager.AXIS_MINUS_X, SensorManager.AXIS_Y, R2);
else   // Default display rotation is landscape
    SensorManager.remapCoordinateSystem(Rmat, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, R2);

теперь это работает... Надеюсь, это будет полезно для кого-то еще!

person gurkan    schedule 26.06.2013
comment
Что такое R2 в этом растворе? - person hubatish; 23.03.2017
comment
@hubatish R2 — это новая матрица, и вы должны использовать ее в качестве входной матрицы для API SensorManager.getOrientation() вместо Rmat. - person dragonfly; 31.03.2017

Я не знаю о вашем пути. Но у меня работает следующий способ.

int orientation = getResources().getConfiguration().orientation;

Здесь orientation равно 1, если устройство находится в режиме landscape, и 2, если устройство находится в режиме portrait.

Я надеюсь, что это поможет вам.

person Gunaseelan    schedule 26.06.2013
comment
Я использовал этот фрагмент, чтобы получить ориентацию устройства, но это не решает мою проблему. Проблема в том, что на некоторых устройствах сенсор работает только в портретном режиме. Он не меняет свою ориентацию на ориентацию устройства. - person gurkan; 26.06.2013