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

Android 21及以上版本锁屏禁用异常:屏幕熄灭后锁屏自动恢复求助

解决方案:解决屏幕熄灭后锁屏自动恢复的问题

我之前也碰到过一模一样的问题!本质原因是屏幕熄灭再点亮时,系统会重置锁屏状态,你之前设置的禁用锁屏标记会被系统自动清除。下面分Android版本给你整理可行的修复方案:

一、Android 10(API 29)及以上版本

从Android 10开始,KeyguardLock和旧版的FLAG_DISMISS_KEYGUARD行为被限制,官方推荐用KeyguardManager.requestDismissKeyguard()配合窗口标记来处理:

// 初始化KeyguardManager
KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);

// 请求解除锁屏并处理回调
if (keyguardManager.isKeyguardLocked()) {
    keyguardManager.requestDismissKeyguard(this, new KeyguardManager.KeyguardDismissCallback() {
        @Override
        public void onDismissSucceeded() {
            // 锁屏解除成功后的逻辑
        }

        @Override
        public void onDismissFailed() {
            // 锁屏解除失败后的逻辑
        }
    });
}

// 添加窗口标记,确保屏幕点亮时直接显示Activity,跳过锁屏
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

二、Android 5.0(API 21)到Android 9(API 28)版本

这部分版本可以继续使用FLAG_DISMISS_KEYGUARD,但必须配合屏幕广播监听,在屏幕点亮时重新设置标记,避免系统重置:

1. 先在Manifest中添加权限

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

2. 核心代码实现

// 封装设置锁屏标记的方法
private void setupLockScreenFlags() {
    Window window = getWindow();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
        window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
        window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    } else {
        KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
        KeyguardManager.KeyguardLock kl = km.newKeyguardLock("MyAppLockTag");
        kl.disableKeyguard();
    }
}

// 监听屏幕点亮广播,重新设置标记
private BroadcastReceiver screenOnReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) {
            setupLockScreenFlags();
        }
    }
};

// 在Activity生命周期中注册/注销广播
@Override
protected void onResume() {
    super.onResume();
    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
    registerReceiver(screenOnReceiver, filter);
    setupLockScreenFlags();
}

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(screenOnReceiver);
}

三、关键注意点

  • FLAG_SHOW_WHEN_LOCKED是核心:这个标记能让你的Activity在锁屏状态下直接显示,从根源上避免系统触发锁屏界面。
  • 广播监听不可少:屏幕每次点亮时系统都会重置锁屏状态,必须重新设置禁用标记才能维持效果。
  • 权限适配:Android 9及以下需要DISABLE_KEYGUARD权限,Android 10及以上无需此权限,但要保证Activity能正常前台显示。

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

火山引擎 最新活动