You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android视频流应用屏幕旋转切换失效及物理旋转异常求助

解决Android视频流应用横竖屏切换及物理旋转失效问题

你遇到的这两个问题——横屏切回竖屏无响应、切换后物理旋转失效,其实都和屏幕方向的模式设置以及状态变量的管理有关,我来给你拆解并解决:

问题根源分析

  1. 状态变量丢失inPortrait这个标记变量在屏幕旋转触发Activity重建后,会被重置为初始值,导致下次点击按钮时的逻辑判断完全错误。
  2. 方向模式选择不当:你切回竖屏时用了SCREEN_ORIENTATION_SENSOR_PORTRAIT,这个模式会把屏幕锁定在竖屏范畴(仅允许竖屏内的小角度传感器调整),且之后没有恢复到默认的全方向传感器模式,所以物理旋转设备时屏幕不再响应。另外,如果只是想要固定竖屏,应该用SCREEN_ORIENTATION_PORTRAIT而非带Sensor的版本。

修正后的解决方案

1. 保存并恢复状态变量

首先要确保inPortrait的状态在Activity重建时不丢失,通过onSaveInstanceStateonCreate来处理:

private boolean inPortrait;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_video_layout);
    
    // 重建时恢复状态,初始状态判断当前屏幕方向
    if (savedInstanceState != null) {
        inPortrait = savedInstanceState.getBoolean("isPortrait", true);
    } else {
        inPortrait = getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;
    }
    
    mScreenRotateButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            toggleScreenOrientation();
        }
    });
}

// 保存状态到Bundle,避免重建丢失
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBoolean("isPortrait", inPortrait);
}

2. 调整方向切换逻辑

根据你的需求选择对应的逻辑:

  • 需求1:切换回竖屏后固定竖屏,物理旋转不响应
private void toggleScreenOrientation() {
    if (inPortrait) {
        // 切换到固定横屏
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        inPortrait = false;
    } else {
        // 切换回固定竖屏
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        inPortrait = true;
    }
}
  • 需求2:切换回竖屏后恢复物理旋转功能
private void toggleScreenOrientation() {
    if (inPortrait) {
        // 切换到固定横屏
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        inPortrait = false;
    } else {
        // 恢复到全方向传感器模式,允许物理旋转
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
        // 实时更新当前方向状态
        inPortrait = getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;
    }
}

3. 可选:监听方向变化(适配不重建的Activity)

如果你的Activity在Manifest里设置了android:configChanges="orientation|screenSize"来避免重建,需要在onConfigurationChanged里同步更新inPortrait

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    inPortrait = newConfig.orientation == Configuration.ORIENTATION_PORTRAIT;
}

额外注意点

  • 检查AndroidManifest.xml里的Activity是否设置了固定的android:screenOrientation属性,这个会覆盖代码中的方向设置。
  • 视频流切换横竖屏时,记得暂停/恢复视频播放,避免出现画面卡顿或声音异常的情况。

内容的提问来源于stack exchange,提问作者Eco4ndly

火山引擎 最新活动