在Android上仅允许纵向时检测方向更改

时间:2012-08-29 11:34:58

标签: android android-orientation

我必须解决以下问题:我有一个Activity android:screenOrientation="portrait"。即使当设备在Activity可见时旋转到横向时,我必须启动另一个,并且当设备旋转回纵向时,我必须finish()横向活动。我尝试使用BroadcastReceiver执行此操作,但由于android:screenOrientation="portrait",此特殊活动不会收到任何广播。任何帮助都很受欢迎。

感谢。

7 个答案:

答案 0 :(得分:5)

Philipp在Get phone orientation but fix screen orientation to portrait的解决方案对我来说非常合适:

您可以使用SensorManager类获取Android设备的方向,即使在Manifest中通过android禁用自动方向切换:screenOrientation =" portrait"

请参阅此代码(由Philipp,请参阅上面的链接):

SensorManager sensorManager = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE);
    sensorManager.registerListener(new SensorEventListener() {
        int orientation=-1;;

        @Override
        public void onSensorChanged(SensorEvent event) {
            if (event.values[1]<6.5 && event.values[1]>-6.5) {
                if (orientation!=1) {
                    Log.d("Sensor", "Landscape");
                }
                orientation=1;
            } else {
                if (orientation!=0) {
                    Log.d("Sensor", "Portrait");
                }
                orientation=0;
            }
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // TODO Auto-generated method stub

        }
    }, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME);

答案 1 :(得分:3)

当android:screenOrientation =“portrait”或“landscape”在清单文件中设置时,如果你想这样做仍然没有触发侦听器尝试以编程方式处理你的onConfigurationChanged()中的仅肖像模式,这里你也将是能够再次开始活动。

答案 2 :(得分:0)

您是否使用过Orientation Listener?我不确定这是否正是你所需要的,但是我正在收集你想知道什么时候方向来回变化:

  

http://developer.android.com/reference/android/view/OrientationListener.html

答案 3 :(得分:0)

您需要使用的类是OrientationEventListener,假设您可以检测旋转。如果您使用android:screenOrientation="portrait"强制屏幕进入特定方向,则不会触发这些事件。

相反,我建议制作两个layout.xml文件并使用配置限定符来确定应显示哪个。 (http://developer.android.com/guide/practices/screens_support.html

res/layout-land/my_layout.xml
res/layout-port/my_layout.xml

然后使用OrientationEventListener检测屏幕何时旋转。当屏幕从横向旋转到纵向时,您可以finish();或调用您想要的任何功能。

祝你好运!

答案 4 :(得分:0)

您始终可以使用传感器找到您的方向;

public static final int PORTRAIT        = 0;
public static final int PORTRAIT_REV    = 2;
public static final int LANDSCAPE       = 1;
public static final int LANDSCAPE_REV   = 3;

private final SensorEventListener mListener = new SensorEventListener() {

   public void onSensorChanged(SensorEvent event) {


            azimuth = event.values[0];
            pitch   = event.values[1];
            roll    = event.values[2];

            {
                if (pitch < -45 && pitch > -135) {
                    orient = PORTRAIT;
                } else if (pitch > 45 && pitch < 135) {
                    orient = PORTRAIT_REV;
                } else if (roll > 45) {
                    orient = LANDSCAPE;
                } else if (roll < -45) {
                    orient = LANDSCAPE_REV;
                }

            }

           // if(orient!=lastOrient && !orientChanging)
           // {
           //   orientChangeStart = System.currentTimeMillis();
           //   orientChanging = true;
           // }
}

答案 5 :(得分:0)

你可以通过几种方式实现,一种是收听其他帖子中讨论的广播消息,另一种选择如下。

在活动清单中设置android:configChanges="orientation",以便您控制方向更改。通过这样做,您可以覆盖onConfigurationChanged()方法并开始新的活动活动。

答案 6 :(得分:0)

经过一番挣扎之后,我发现的最好的方法是使用OrientationEventListener,如下所示:

private void addOrientationListener()
    {
        OrientationEventListener listener=new OrientationEventListener(getActivity(), SensorManager.SENSOR_DELAY_UI)
        {
            public void onOrientationChanged(int orientation) {

                if( (orientation>=230 && orientation<=290) || (orientation>=70 && orientation<=90))
                {
                    isLandscape=true;
                }
                else if(orientation==-1){
                    //KEEP THE CURRENT SATTE
                }
                else
                {
                    isLandscape=false;
                }
            }
        };
        if(listener.canDetectOrientation())
            listener.enable();
    }

你应该在OnPause()

上调用disable()