如何在带刘海屏的Android设备上实现ExoPlayer全屏显示
ExoPlayer刘海屏全屏显示配置调整方案
现有配置的核心问题出在布局的fitsSystemWindows属性限制了布局延伸到系统状态栏/刘海区域,结合以下调整即可实现真正全屏:
1. 调整布局属性
将根布局RelativeLayout的android:fitsSystemWindows属性从true改为false,该属性设为true时会自动为布局添加状态栏高度的内边距,阻碍布局延伸到刘海区域。修改后的根布局配置如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="false" android:id="@+id/videoPlayerContainer" android:background="@android:color/black" > <!-- 其余子布局保持不变 -->
2. 补充主题配置
你已添加基础刘海屏适配属性,补充透明系统栏配置即可,修改后的AppTheme如下:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> <item name="android:windowFullscreen">true</item> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <!-- 刘海屏适配 --> <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item> <!-- 新增透明系统栏配置 --> <item name="android:statusBarColor">@android:color/transparent</item> <item name="android:navigationBarColor">@android:color/transparent</item> </style>
3. Activity代码添加沉浸式配置
在播放页Activity的onCreate方法中添加以下代码,强制允许布局延伸到刘海区域,同时开启沉浸模式:
Kotlin 示例
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { window.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES } window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS) window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
Java 示例
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { WindowManager.LayoutParams params = getWindow().getAttributes(); params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; getWindow().setAttributes(params); } getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
4. 可选:调整ExoPlayer缩放模式
如果不需要拉伸视频,可将PlayerView和AspectRatioFrameLayout的app:resize_mode从fill改为zoom,该模式会裁剪视频多余部分保持原比例,同时铺满整个屏幕(包括刘海区域),避免画面变形。
调整完成后重新运行测试,即可看到播放器界面延伸到刘海区域实现真正全屏。
内容的提问来源于stack exchange,提问作者yamete senpai
相关产品推荐
相关产品推荐

