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

Android 12/13三星等机型Fullscreen Intent失效,如何检测弹窗设置状态?

检测厂商自定义Fullscreen Intent弹窗设置状态的方案

你遇到的问题是Android 12/13版本下,三星、OPPO、小米等品牌设备会通过自定义系统设置控制Fullscreen Intent通知的弹出,这类设置没有统一的谷歌官方API可以检测,需要针对不同厂商分别实现检测逻辑:

图中展示了某Android设备的应用权限设置界面,其中包含专门的"允许弹窗"类开关,这类开关就是厂商用来控制Fullscreen Intent的自定义设置项。

按品牌的检测与引导方案

1. 小米/Redmi设备

小米系设备的该设置属于"显示悬浮窗"权限的细分控制,可通过反射检测权限状态:

fun isMiuiFullscreenIntentEnabled(context: Context): Boolean {
    return try {
        val miuiOsClass = Class.forName("android.os.MiuiOs")
        val checkPermissionMethod = miuiOsClass.getMethod(
            "checkPermission",
            String::class.java,
            Int::class.java,
            Int::class.java
        )
        val permission = "android.permission.SYSTEM_ALERT_WINDOW"
        val result = checkPermissionMethod.invoke(
            null,
            permission,
            android.os.Process.myUid(),
            context.packageName
        ) as Int
        result == PackageManager.PERMISSION_GRANTED
    } catch (e: Exception) {
        // 反射失败时默认返回未开启
        false
    }
}

引导用户开启的跳转代码:

fun openMiuiPopupSettings(context: Context) {
    try {
        val intent = Intent("miui.intent.action.APP_PERM_EDITOR")
        intent.putExtra("extra_pkgname", context.packageName)
        context.startActivity(intent)
    } catch (e: Exception) {
        // 跳转失败时 fallback 到应用详情页
        val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
        intent.data = Uri.parse("package:${context.packageName}")
        context.startActivity(intent)
    }
}

2. 三星设备

三星的该权限对应"弹出窗口"设置,检测方式如下:

fun isSamsungPopupEnabled(context: Context): Boolean {
    return try {
        val securityManager = context.getSystemService(Context.SECURITY_SERVICE) as SecurityManager
        val checkPermissionMethod = securityManager.javaClass.getMethod(
            "checkPermission",
            String::class.java,
            Int::class.java,
            Int::class.java
        )
        val permission = "android.permission.SYSTEM_ALERT_WINDOW"
        val result = checkPermissionMethod.invoke(
            securityManager,
            permission,
            android.os.Process.myUid(),
            context.packageName
        ) as Int
        result == PackageManager.PERMISSION_GRANTED
    } catch (e: Exception) {
        false
    }
}

跳转设置页面:

fun openSamsungPopupSettings(context: Context) {
    try {
        val intent = Intent("com.samsung.android.sm.action.APPLICATION_POPUP_PERMISSION_SETTING")
        intent.putExtra("packageName", context.packageName)
        context.startActivity(intent)
    } catch (e: Exception) {
        val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
        intent.data = Uri.parse("package:${context.packageName}")
        context.startActivity(intent)
    }
}

3. OPPO/Realme设备

OPPO系设备的该设置对应"悬浮窗"权限,检测代码:

fun isOppoPopupEnabled(context: Context): Boolean {
    return try {
        val permissionManagerClass = Class.forName("com.coloros.security.permission.PermissionManager")
        val checkPermissionMethod = permissionManagerClass.getMethod(
            "checkPermission",
            Context::class.java,
            String::class.java
        )
        val permission = "android.permission.SYSTEM_ALERT_WINDOW"
        val result = checkPermissionMethod.invoke(
            null,
            context,
            permission
        ) as Int
        result == PackageManager.PERMISSION_GRANTED
    } catch (e: Exception) {
        false
    }
}

跳转设置页面:

fun openOppoPopupSettings(context: Context) {
    try {
        val intent = Intent("com.coloros.safecenter.permission.floatwindow.FloatWindowListActivity")
        context.startActivity(intent)
    } catch (e: Exception) {
        val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
        intent.data = Uri.parse("package:${context.packageName}")
        context.startActivity(intent)
    }
}

通用适配逻辑

可以通过设备品牌判断来调用对应检测方法,同时兼容其他品牌设备:

fun checkFullscreenIntentPopupPermission(context: Context): Boolean {
    return when (Build.MANUFACTURER.lowercase(Locale.getDefault())) {
        "xiaomi", "redmi" -> isMiuiFullscreenIntentEnabled(context)
        "samsung" -> isSamsungPopupEnabled(context)
        "oppo", "realme" -> isOppoPopupEnabled(context)
        else -> {
            // 其他品牌默认检测系统悬浮窗权限
            Settings.canDrawOverlays(context)
        }
    }
}

重要提示

  • 这些反射调用的都是厂商非公开API,可能随系统版本更新失效,需要针对不同系统版本做测试适配
  • 若检测到权限未开启,直接引导用户跳转至对应设置页,避免让用户手动寻找设置项
  • 即使开启了上述权限,仍需确保已申请POST_NOTIFICATIONS和USE_FULL_SCREEN_INTENT权限

内容的提问来源于stack exchange,提问作者Huy Duong Tu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 19:47:34