Android在指定requestedOrientation时检测设备方向

Android在指定requestedOrientation时检测设备方向,android,android-layout,android-orientation,Android,Android Layout,Android Orientation,我正在构建一个视频流应用程序。它有一个Youtube风格的布局,上面是视频的肖像布局,底部是其他内容的列表。该应用程序可以通过旋转设备或单击按钮在横向屏幕上全屏显示视频 现在,如果我将手机旋转到横向,然后将其旋转回纵向,则布局将恢复到预期的纵向。相反,如果我单击按钮强制进入纵向模式,在横向旋转设备以查看视频,然后将其旋转回纵向,则布局仍保持横向 我在清单中的活动: <activity android:name="MyActivity" android

我正在构建一个视频流应用程序。它有一个Youtube风格的布局,上面是视频的肖像布局,底部是其他内容的列表。该应用程序可以通过旋转设备或单击按钮在横向屏幕上全屏显示视频

现在,如果我将手机旋转到横向,然后将其旋转回纵向,则布局将恢复到预期的纵向。相反,如果我单击按钮强制进入纵向模式,在横向旋转设备以查看视频,然后将其旋转回纵向,则布局仍保持横向

我在清单中的活动:

    <activity
        android:name="MyActivity"
        android:configChanges="keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout"
        android:label="@string/app_name"
        android:launchMode="singleTask" />
我的onConfigurationChanged方法(我注意到,如果我单击按钮,然后旋转手机,只要requestedOrientation的设置与未指定的不同,就不再调用此方法):

我尝试将requestedOrientation重置为未指定,如下所示:

@Override
public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
    {
        // Set the layout for landscape mode
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        // Set the layout for portrait mode        
    }
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}

但它不起作用,因为方向是从纵向强制到横向,然后在用户有机会将其旋转到横向之前再次设置为“未指定”,所以它立即再次更改为纵向,似乎什么也没做。

好的,我找到了一个解决方案。它不适合我,所以我稍微修改了一下:

main活动

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Surface;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {

    private SensorManager mSensorManager;
    private Sensor mOrientation;

    private boolean mIsForcingOrientation = false;

    float value_0 = -10000;
    float value_1 = -10000;

    private SensorEventListener mOrientationSensorListener = new SensorEventListener() {
        int orientation = -1;

        @Override
        public void onSensorChanged(SensorEvent event) {
            int value ;
            if(value_0 == event.values[0] && value_1==event.values[1]){
                return;
            }
            if (value_0 < 0 && event.values[0] > 0){
                // Setting rotation to 270°: Landscape reverse
                value = Surface.ROTATION_270;                
            } else if (value_0 > 0 && event.values[0] < 0){
                // Setting rotation to 90°: Landscape
                value = Surface.ROTATION_90;                
            } else if (value_1 < 0 && event.values[1] > 0){
                // Setting rotation to 180°: Portrait reverse
                value = Surface.ROTATION_180;                
            } else if (value_1 > 0 && event.values[1] < 0){
                // Setting rotation to 0°: Portrait
                value = Surface.ROTATION_0                
            } else {
                value = orientation;
            }

            if (orientation != value) {
                if((requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT && (value == Surface.ROTATION_90 || value == Surface.ROTATION_270) ) ||
                (requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE && (value == Surface.ROTATION_0 || value == Surface.ROTATION_180) )     ){
                    isForcingOrientation = false;
                    requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
                }
            }

            value_0=event.values[0];
            value_1=event.values[1];
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Get sensor manager
        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        // Get the default sensor of specified type
        mOrientation = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

        mChangeOrientButton.setOnClickListener((OnClickListener)(new OnClickListener() {
            public final void onClick(View it) {
                mIsForcingOrientation = true;
                if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                } else if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                } else {
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
                }
            }
        }));
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (mOrientation != null) {
            mSensorManager.registerListener(mOrientationSensorListener, mOrientation,
                    SensorManager.SENSOR_DELAY_GAME);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (mOrientation != null) {
            mSensorManager.unregisterListener(mOrientationSensorListener);
        }
    }
}
导入android.content.Context;
导入android.hardware.Sensor;
导入android.hardware.SensorEvent;
导入android.hardware.SensorEventListener;
导入android.hardware.SensorManager;
导入android.os.Bundle;
导入android.support.v7.app.AppActivity;
导入android.util.Log;
导入android.view.Surface;
导入android.widget.ImageView;
公共类MainActivity扩展了AppCompatActivity{
私人传感器管理器;
专用传感器监测;
私有布尔值mIsForcingOrientation=false;
浮动值_0=-10000;
浮动值_1=-10000;
私有SensorEventListener MorentationSensorListener=新的SensorEventListener(){
int方向=-1;
@凌驾
传感器更改时的公共无效(传感器事件){
int值;
if(value_0==event.values[0]&&value_1==event.values[1]){
返回;
}
if(值0<0&&event.values[0]>0){
//将旋转设置为270°:横向反转
值=Surface.ROTATION_270;
}else if(值0>0&&event.values[0]<0){
//将旋转设置为90°:横向
值=Surface.ROTATION_90;
}else if(值_1<0&&event.values[1]>0){
//将旋转设置为180°:纵向反转
值=Surface.ROTATION_180;
}else if(值_1>0&&event.values[1]<0){
//将旋转设置为0°:纵向
值=Surface.ROTATION\u 0
}否则{
价值=方向;
}
如果(方向!=值){
如果((requestedOrientation==ActivityInfo.SCREEN_ORIENTATION_Grait&&(value==Surface.ROTATION_90|124; value==Surface.ROTATION_270))||
(requestedOrientation==ActivityInfo.SCREEN_ORIENTATION_横向&&(value==Surface.ROTATION_0 | | value==Surface.ROTATION_180))){
isForcingOrientation=假;
requestedOrientation=ActivityInfo.SCREEN\u ORIENTATION\u未指定;
}
}
value_0=事件值[0];
值_1=事件值[1];
}
@凌驾
精度更改时的公共无效(传感器,int精度){
}
};
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取传感器管理器
msSensorManager=(SensorManager)getSystemService(Context.SENSOR\u服务);
//获取指定类型的默认传感器
mOrientation=mSensorManager.getDefaultSensor(传感器类型\加速计);
mChangeOrientButton.setOnClickListener((OnClickListener)(新的OnClickListener(){
公共最终作废onClick(查看它){
方向错误=正确;
if(getResources().getConfiguration().orientation==Configuration.orientation\u纵向){
setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u横向);
}else if(getResources().getConfiguration().orientation==Configuration.orientation\u横向){
setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u Picture);
}否则{
setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u未指定);
}
}
}));
}
@凌驾
受保护的void onResume(){
super.onResume();
if(morentation!=null){
msSensorManager.registerListener(MorentationSensorListener,Morentation,
传感器管理器。传感器(延迟游戏);
}
}
@凌驾
受保护的void onPause(){
super.onPause();
if(morentation!=null){
msSensorManager.unregisterListener(MorentationSensorListener);
}
}
}
可能很方便。
@Override
public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
    {
        // Set the layout for landscape mode
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        // Set the layout for portrait mode        
    }
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Surface;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {

    private SensorManager mSensorManager;
    private Sensor mOrientation;

    private boolean mIsForcingOrientation = false;

    float value_0 = -10000;
    float value_1 = -10000;

    private SensorEventListener mOrientationSensorListener = new SensorEventListener() {
        int orientation = -1;

        @Override
        public void onSensorChanged(SensorEvent event) {
            int value ;
            if(value_0 == event.values[0] && value_1==event.values[1]){
                return;
            }
            if (value_0 < 0 && event.values[0] > 0){
                // Setting rotation to 270°: Landscape reverse
                value = Surface.ROTATION_270;                
            } else if (value_0 > 0 && event.values[0] < 0){
                // Setting rotation to 90°: Landscape
                value = Surface.ROTATION_90;                
            } else if (value_1 < 0 && event.values[1] > 0){
                // Setting rotation to 180°: Portrait reverse
                value = Surface.ROTATION_180;                
            } else if (value_1 > 0 && event.values[1] < 0){
                // Setting rotation to 0°: Portrait
                value = Surface.ROTATION_0                
            } else {
                value = orientation;
            }

            if (orientation != value) {
                if((requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT && (value == Surface.ROTATION_90 || value == Surface.ROTATION_270) ) ||
                (requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE && (value == Surface.ROTATION_0 || value == Surface.ROTATION_180) )     ){
                    isForcingOrientation = false;
                    requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
                }
            }

            value_0=event.values[0];
            value_1=event.values[1];
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Get sensor manager
        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        // Get the default sensor of specified type
        mOrientation = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

        mChangeOrientButton.setOnClickListener((OnClickListener)(new OnClickListener() {
            public final void onClick(View it) {
                mIsForcingOrientation = true;
                if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                } else if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                } else {
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
                }
            }
        }));
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (mOrientation != null) {
            mSensorManager.registerListener(mOrientationSensorListener, mOrientation,
                    SensorManager.SENSOR_DELAY_GAME);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (mOrientation != null) {
            mSensorManager.unregisterListener(mOrientationSensorListener);
        }
    }
}