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

如何检测Display cutout?现有代码在带刘海设备上检测失败

解决Display Cutout检测失败的问题

你的代码逻辑本身没问题,但检测失败通常是因为窗口未配置为允许延伸至刘海区域,或者监听器设置时机/Insets处理方式不对,以下是具体的修复方案:

1. 配置Manifest允许窗口覆盖刘海

在AndroidManifest.xml的对应Activity标签中添加以下属性,让应用窗口可以延伸到刘海区域:

<activity
    android:name=".MainActivity"
    android:layout_inDisplayCutoutMode="shortEdges">
    <!-- 其他属性 -->
</activity>

shortEdges表示窗口允许延伸到屏幕短边(比如上下边)的刘海区域,若需要覆盖所有边可选择always模式,具体可根据需求调整。

2. 修正Insets处理逻辑

你代码中返回insets.consumeSystemWindowInsets()会消费掉系统窗口Insets,可能导致DisplayCutout无法正确被获取。建议直接返回原始Insets,修正后的代码如下:

View decorView = getWindow().getDecorView();
decorView.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
    @Override
    public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            DisplayCutout displayCutout = insets.getDisplayCutout();
            if (displayCutout != null) {
                Log.d(TAG, "Display cutout detected");
                Toast.makeText(MainActivity.this, "Detected", Toast.LENGTH_LONG).show();
            } else {
                Log.d(TAG, "No display cutout detected");
                Toast.makeText(MainActivity.this, "Not Detected", Toast.LENGTH_LONG).show();
            }
        }
        // 直接返回原始Insets,避免干扰系统处理
        return insets;
    }
});

3. 确保监听器设置时机正确

建议在Activity的onCreate方法中,调用setContentView之后再设置监听器,确保DecorView已完成初始化:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    // 在这里设置监听器
    View decorView = getWindow().getDecorView();
    // ... 后续监听逻辑代码
}

4. 适配部分厂商特殊刘海检测(可选)

部分国产厂商在Android P之前就有自定义刘海实现,若需要兼容这些低版本设备,可参考对应厂商的适配文档添加权限或专属检测逻辑,但针对Android P及以上设备,前面的方案已足够解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:17:26