You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

API 27(Android 8.0)下GLSurfaceView全屏功能失效问题求助

解决Android 8.0(API27)上GLSurfaceView全屏顶部黑块问题

我之前也碰到过一模一样的坑!在Android 8.0及以上设备上用传统全屏代码设置后,GLSurfaceView顶部总是留着一块黑块,但API27以下的设备完全正常。先给大家还原下问题场景:

问题场景

我的布局文件是这样的:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/transparent"
    tools:context="ui.wearing.WearingActivity">

    <GLSurfaceView
        android:id="@+id/camera_screen"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true">
    </GLSurfaceView>
</RelativeLayout>

最初的全屏实现代码是:

super.onCreate(savedInstanceState);
// 移除标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.webview_act);

这段代码在低版本系统上完全没问题,但到了Android 8.0,GLSurfaceView顶部就会出现黑块,没法真正铺满全屏。

问题原因

Android 8.0(API27)对窗口布局的逻辑做了调整,传统的FLAG_FULLSCREEN已经无法让内容完全延伸到状态栏原本的区域,系统会默认保留状态栏的占位空间,导致GLSurfaceView没法顶到屏幕最上方。

解决方案

试试更新你的全屏设置代码,加入FLAG_LAYOUT_NO_LIMITS,同时适配Android 8.0的窗口特性:

super.onCreate(savedInstanceState);

// 分版本适配全屏设置
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN
            | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
} else {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
// 让窗口布局不受系统栏限制,彻底铺满屏幕
getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
        WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

setContentView(R.layout.webview_act);

另外,也可以在Activity对应的主题里添加以下属性,从主题层面确保全屏效果:

<style name="FullScreenTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <!-- 适配Android 8.0+的刘海屏/挖孔屏 -->
    <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
</style>

这样调整后,GLSurfaceView应该就能在Android 8.0设备上正常全屏显示,顶部的黑块也会消失。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:21:34