使用expo-av播放视频时Android全屏模式下系统导航栏无法隐藏
解决Expo AV Android全屏时导航栏无法隐藏的问题
针对你遇到的Expo AV全屏播放视频时Android导航栏无法隐藏的问题,以下是几个可行的排查和解决方向:
1. 调整导航栏隐藏的时机与方式
你的代码使用PLAYER_WILL_PRESENT事件触发隐藏,但Expo AV的全屏播放器可能在该事件之后通过原生逻辑重置了导航栏状态。可以尝试切换到PLAYER_DID_PRESENT事件,同时使用沉浸式模式替代单纯的导航栏隐藏:
import { VideoFullscreenUpdate } from 'expo-av'; import SystemNavigationBar from 'react-native-system-navigation-bar'; const onFullscreenUpdate = async ({ fullscreenUpdate }) => { switch (fullscreenUpdate) { case VideoFullscreenUpdate.PLAYER_DID_PRESENT: // 启用沉浸式模式,完全隐藏状态栏和导航栏 await SystemNavigationBar.setImmersive(true); break; case VideoFullscreenUpdate.PLAYER_DID_DISMISS: // 恢复正常模式 await SystemNavigationBar.setImmersive(false); await SystemNavigationBar.navigationShow(); break; } };
setImmersive(true)会让Android进入真正的沉浸模式,导航栏和状态栏会完全隐藏,仅在屏幕边缘滑动时临时显示,这种模式不容易被其他组件的原生逻辑覆盖。
2. 检查Expo AV的全屏配置
尝试在调用全屏播放器时传入自定义配置参数(部分版本支持):
playerRef.current?.presentFullscreenPlayer({ preferredOrientation: 'landscape', // 若版本支持,可添加隐藏系统UI的相关配置 });
同时检查app.json中的Android全局配置,确保允许窗口调整系统栏:
{ "expo": { "android": { "windowSoftInputMode": "adjustResize", "config": { "android": { "windowDrawsSystemBarBackgrounds": true, "statusBarColor": "transparent" } } } } }
3. 确认依赖库的兼容性
确保react-native-system-navigation-bar版本与当前Expo SDK版本兼容,若版本不匹配可能导致API调用失效。尝试更新到最新兼容版本:
npm install react-native-system-navigation-bar@latest
4. Bare Workflow下的原生层调整
如果你的项目是Bare Workflow,可以直接修改Android原生代码,在全屏时强制隐藏导航栏:
在MainActivity.java中添加沉浸式逻辑:
import android.os.Bundle; import android.view.View; import com.facebook.react.ReactActivity; public class MainActivity extends ReactActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 进入全屏时隐藏导航栏 getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_IMMERSIVE | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN ); } }
该方式为全局生效,需结合Expo AV的全屏事件动态切换状态。
内容的提问来源于stack exchange,提问作者Rameez Hussain
相关产品推荐
相关产品推荐

