Определение ориентации экрана в Android - PullRequest
1 голос
/ 26 мая 2011

Я внедряю камеру в Android. Я сохранил активность как пейзаж в манифесте. Так как я дал фиксированную ориентацию, я не могу получить ориентацию на дисплее. это всегда дает как LandScape. Но я хочу знать, когда мое устройство находится в вертикальном или вертикальном положении. Я не хочу ориентацию экрана. Кто-нибудь может предложить хороший способ определения ориентации устройства.

Спасибо всем

Ответы [ 5 ]

3 голосов
/ 26 мая 2011

Я думаю, вам придется прослушивать обновления датчика акселерометра и анализировать их, чтобы определить, когда изменится ориентация. Вот некоторые примеры прослушивания датчиков здесь: http://www.anddev.org/accessing_the_accelerometer-t499.html и здесь http://mobilestrategist.blogspot.com/2010/01/android-accelerometer-and-orientation.html

3 голосов
/ 26 мая 2011
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {

//          Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();

        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){

//          Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
        }
        // Checks whether a hardware keyboard is available
        if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
//          Toast.makeText(this, "keyboard visible", Toast.LENGTH_SHORT).show();
        } else if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) {
//          Toast.makeText(this, "keyboard hidden", Toast.LENGTH_SHORT).show();
        }
    }
1 голос
/ 19 февраля 2016

Попробуйте: сначала внедрите SensorEventListener и получите RotationSensor

sensorManager = (SensorManager)getActivity().getSystemService(Context.SENSOR_SERVICE);
rotationSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
sensorManager.registerListener(this, rotationSensor, SENSOR_INTERVAL);
int FROM_RADS_TO_DEGS = -57;

Затем вы можете определить угол наклона устройства следующим образом:

@Override
public void onSensorChanged(SensorEvent event) {
    if(event.sensor == rotationSensor) {
        if (event.values.length > 4) {
            float[] truncatedRotationVector = new float[4];
            System.arraycopy(event.values, 0, truncatedRotationVector, 0, 4);
            updateRotation(truncatedRotationVector);
        } else {
            updateRotation(event.values);
        }
    }
}

private void updateRotation(float[] vectors) {
    float[] rotationMatrix = new float[9];
    SensorManager.getRotationMatrixFromVector(rotationMatrix, vectors);
    int worldAxisX = SensorManager.AXIS_X;
    int worldAxisZ = SensorManager.AXIS_Z;
    float[] adjustedRotationMatrix = new float[9];
    SensorManager.remapCoordinateSystem(rotationMatrix, worldAxisX, worldAxisZ, adjustedRotationMatrix);
    float[] orientation = new float[3];
    SensorManager.getOrientation(adjustedRotationMatrix, orientation);
    float pitch = orientation[1] * FROM_RADS_TO_DEGS;
    if(pitch < -45 && pitch > -135) {
        // if device is laid flat on a surface, we don't want to change the orientation
        return;
    }
    float roll = Math.abs(orientation[2] * FROM_RADS_TO_DEGS);
    if((roll > 45 && roll < 135)) {
        // The device is closer to landscape orientation. Enable fullscreen
        if(!player.isFullScreen()) {
            if(getActivity() != null) {
                player.setFullScreenOn();
            }
        }
    }
    else {
        // The device is closer to portrait orientation. Disable fullscreen
        if(player.isFullScreen()) {
            if(getActivity() != null) {
                player.setFullScreenOff();
            }
        }
    }
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
    // Do nothing
}

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

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

Он использует аппаратное обеспечение RotationSensor, и не все устройства Android имеют RotationSensor.Если кто-нибудь знает способ сделать это с помощью какого-либо оборудования, которое включено на всех устройствах (определенно есть способ, потому что Android знает, когда менять ориентацию), пожалуйста, дайте мне знать в комментарии, чтобы я мог обновить свой собственный код.

1 голос
/ 26 мая 2011

Чтобы определить ориентацию экрана, вы можете использовать следующий код в своей деятельности

@Override
    public void onConfigurationChanged(Configuration newConfig)
    { super.onConfigurationChanged(newConfig);
    }

Спасибо Deepak

0 голосов
/ 26 мая 2011

Я использую это:

@Override
    public void onConfigurationChanged(Configuration _newConfig){
        super.onConfigurationChanged(_newConfig);
        int height = getWindowManager().getDefaultDisplay().getHeight();
        int width = getWindowManager().getDefaultDisplay().getWidth();
        if(width > height){
// landscape
        }else{
// portrait
        }
    }

Это грубо, но эффективно.

...