You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

小米手机FLAG_DISMISS_KEYGUARD失效,锁屏启动Activity异常求助

针对小米设备锁屏Activity解锁后无法正常显示的解决方案

我之前也踩过MIUI锁屏机制的坑,确实它和原生Android的锁屏管控逻辑差异不小,给你几个经过验证的可行方案:

1. 优先使用系统KeyguardManager验证回调(推荐)

小米对直接依赖FLAG_DISMISS_KEYGUARD的支持很有限,建议通过系统统一的解锁验证流程来触发后续Activity启动:

private const val REQUEST_CODE_UNLOCK = 1001

// 在锁屏Activity的按钮点击事件中添加
val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
if (keyguardManager.isKeyguardLocked && keyguardManager.isKeyguardSecure) {
    // 发起系统解锁验证
    val unlockIntent = keyguardManager.createConfirmDeviceCredentialIntent("验证权限", "请完成解锁以启动应用")
    unlockIntent?.let {
        startActivityForResult(it, REQUEST_CODE_UNLOCK)
    }
} else {
    // 锁屏未激活或无保护,直接启动目标Activity
    startActivity(Intent(this, TargetActivity::class.java))
}

// 处理验证结果
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REQUEST_CODE_UNLOCK && resultCode == RESULT_OK) {
        startActivity(Intent(this, TargetActivity::class.java))
    }
}

如果是AndroidX项目,建议用Activity Result API替代onActivityResult,逻辑是一致的。

2. 适配MIUI专属Window Flag与权限

部分MIUI版本需要额外的Window配置和权限声明:
首先在Manifest中添加权限:

<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

然后在锁屏Activity的onCreate方法中设置Window Flags:

window.addFlags(
    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
    or WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
    or WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
    or WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
)

对于Android 10及以上版本,推荐用KeyguardManager.requestDismissKeyguard()替代旧Flag:

val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
keyguardManager.requestDismissKeyguard(this, object : KeyguardManager.KeyguardDismissCallback() {
    override fun onDismissSucceeded() {
        // 解锁成功后启动目标Activity
        startActivity(Intent(this@LockScreenActivity, TargetActivity::class.java))
    }

    override fun onDismissError() {
        // 解锁失败的处理逻辑
    }
})

3. 检查用户端MIUI锁屏设置

部分用户可能开启了MIUI的特殊锁屏选项(比如「直接显示锁屏密码界面」「锁屏快捷应用限制」等),导致你的应用无法正常触发解锁后跳转。可以在应用内添加提示,引导用户检查MIUI的「锁屏密码与指纹」设置,确保你的应用没有被限制锁屏交互权限。

总的来说,MIUI对第三方应用的锁屏交互管控更严格,尽量使用系统官方提供的KeyguardManager相关API,而非依赖旧的Window Flag,能大幅提升兼容性。

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

火山引擎 最新活动