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

Android中FLAG_SHOW_WHEN_LOCKED已废弃,旧代码在新手机上失效求助

解决FLAG_SHOW_WHEN_LOCKED废弃后新款机型失效问题

在Android 10(API 29)及以上版本中,WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED已被官方废弃,你原来的代码在新款智能手机上会失效,以下是官方推荐的替代实现:

步骤1:配置必要权限

在AndroidManifest.xml中添加权限:

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

如果需要保持屏幕常亮,可额外添加WAKE_LOCK权限(也可用FLAG_KEEP_SCREEN_ON替代,二选一即可):

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

步骤2:替换废弃API的代码

直接在Activity的onCreate方法中替换原来的flags代码:

// 替代FLAG_SHOW_WHEN_LOCKED和FLAG_TURN_SCREEN_ON,实现锁屏显示并点亮屏幕
setShowWhenLocked(true);
setTurnScreenOn(true);

// 替代FLAG_DISMISS_KEYGUARD,触发屏幕解锁流程
KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
if (keyguardManager.isKeyguardLocked()) {
    keyguardManager.requestDismissKeyguard(this, new KeyguardManager.KeyguardDismissCallback() {
        @Override
        public void onDismissError() {
            // 解锁失败时的处理逻辑,比如提示用户
        }

        @Override
        public void onDismissSucceeded() {
            // 解锁成功后的操作
        }

        @Override
        public void onDismissCancelled() {
            // 用户取消解锁时的处理
        }
    });
}

// 保持屏幕常亮,替代原来的FLAG_KEEP_SCREEN_ON
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
// 或者使用WakeLock方式(需WAKE_LOCK权限):
// PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
// PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "MyApp:KeepScreenOn");
// wakeLock.acquire(10*60*1000L); // 指定持有时长,避免一直占用资源

注意事项

  • 新方法setShowWhenLocked和setTurnScreenOn是Android 10+的官方标准,无需额外权限即可实现锁屏显示
  • requestDismissKeyguard无法强制解锁,必须用户确认,这是系统安全机制限制
  • 若APP目标SDK版本≥29,必须使用上述新API,旧的FLAG参数会被系统忽略

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:11:00