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
相关产品推荐
相关产品推荐

