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

Android 14唤醒屏幕API失效求助(原API已废弃)

唤醒屏幕功能在Android 14失效的排查与修复

问题背景

  • 开发的App在Android 6~11版本中唤醒屏幕功能正常,但升级到Android 14后该功能失效。
  • 已按废弃API修复建议修改代码,旧Android 6设备仍正常运行,但Android 14真机及模拟器中功能失效。
  • 当前从Fragment跳转回MainActivity的代码:
    Intent intent = new Intent(getActivity(), MainActivity.class);
    startActivity(intent);
    
  • 此前跳转后MainActivity会自动唤醒屏幕,供用户操作,已在Manifest中添加相关配置,MainActivity代码如下:
public class MainActivity extends AppCompatActivity {
    private static final int MY_REQUEST_CODE_PERMISSION = 1000;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        if (Build.VERSION.SDK_INT >= 27) {
            setShowWhenLocked(true);
            setTurnScreenOn(true);
            KeyguardManager guardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
            guardManager.requestDismissKeyguard(this, null);
        } else {
            this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN |
                    WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN |
                    WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

            Window window = this.getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
            window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
            window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
        }
    }
}

修复方案

1. 适配Android 14的权限要求

Android 14对全屏唤醒和解锁操作新增权限限制,需在Manifest中添加:

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

2. 调整唤醒逻辑的执行时机

原代码仅在onCreate中执行唤醒逻辑,但从Fragment跳转回已存在的MainActivity时,onCreate不会触发,需将逻辑移至onResume:

@Override
protected void onResume() {
    super.onResume();
    handleWakeAndUnlock();
}

private void handleWakeAndUnlock() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
        setShowWhenLocked(true);
        setTurnScreenOn(true);
        KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
        
        if (keyguardManager.isKeyguardLocked()) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
                // Android 14需先检查权限
                if (checkSelfPermission(Manifest.permission.USE_FULL_SCREEN_INTENT) == PackageManager.PERMISSION_GRANTED) {
                    keyguardManager.requestDismissKeyguard(this, null);
                } else {
                    requestPermissions(new String[]{Manifest.permission.USE_FULL_SCREEN_INTENT}, MY_REQUEST_CODE_PERMISSION);
                }
            } else {
                keyguardManager.requestDismissKeyguard(this, null);
            }
        }
    } else {
        Window window = getWindow();
        window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    }
}

3. 优化跳转Intent标记

跳转时添加FLAG_ACTIVITY_REORDER_TO_FRONT,确保MainActivity回到前台并触发onResume:

Intent intent = new Intent(getActivity(), MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);

4. 补充Manifest的Activity配置

在MainActivity的<activity>标签中添加showOnLockScreen属性(适用于Android 12+):

<activity
    android:name=".MainActivity"
    android:showOnLockScreen="true">
    <!-- 其他原有配置 -->
</activity>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 01:57:10