KioskHelper.java 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. package com.YuyeTech.HeartRate;
  2. import android.app.Activity;
  3. import android.app.admin.DevicePolicyManager;
  4. import android.content.ComponentName;
  5. import android.content.Context;
  6. import android.util.Log;
  7. import android.view.WindowManager;
  8. import com.ble.mylockview.admin.KioskDeviceAdminReceiver;
  9. /**
  10. * Kiosk 辅助类 - 提供禁用锁屏、屏幕常亮等功能
  11. * Created on 2026/1/22.
  12. */
  13. public class KioskHelper {
  14. private static final String TAG = "KioskHelper";
  15. /**
  16. * 仅用 Context 禁用锁屏(Device Owner 时生效)。
  17. * 用于在 Application 或 BootReceiver 中尽早调用,避免开机自启时处于锁屏阶段导致
  18. * 输入法(IME)无法挂载或显示、被 Keyguard 层级遮挡的问题。
  19. * 调用时机:Application.onCreate() 或 BOOT_COMPLETED/LOCKED_BOOT_COMPLETED 收到时。
  20. */
  21. public static void disableKeyguardIfOwner(Context context) {
  22. if (context == null) {
  23. Log.w(TAG, "Context is null, cannot disable keyguard");
  24. return;
  25. }
  26. try {
  27. Context app = context.getApplicationContext();
  28. DevicePolicyManager dpm = (DevicePolicyManager)
  29. app.getSystemService(Context.DEVICE_POLICY_SERVICE);
  30. ComponentName adminComponent = new ComponentName(app, KioskDeviceAdminReceiver.class);
  31. if (dpm != null && dpm.isDeviceOwnerApp(app.getPackageName())) {
  32. dpm.setKeyguardDisabled(adminComponent, true);
  33. Log.d(TAG, "✅ 锁屏已禁用(Application/开机阶段)");
  34. }
  35. } catch (Exception e) {
  36. Log.e(TAG, "disableKeyguardIfOwner 失败", e);
  37. }
  38. }
  39. /**
  40. * 禁用锁屏和解锁屏幕(在 Activity 创建时调用)
  41. */
  42. public static void disableLockScreen(Activity activity) {
  43. if (activity == null) {
  44. Log.w(TAG, "Activity is null, cannot disable lock screen");
  45. return;
  46. }
  47. try {
  48. // 1. 解锁屏幕(如果当前是锁定状态)
  49. activity.getWindow().addFlags(
  50. WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
  51. WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
  52. WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
  53. );
  54. // 2. 作为 Device Owner 禁用锁屏
  55. DevicePolicyManager dpm = (DevicePolicyManager)
  56. activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
  57. ComponentName adminComponent = new ComponentName(
  58. activity,
  59. KioskDeviceAdminReceiver.class
  60. );
  61. if (dpm != null && dpm.isDeviceOwnerApp(activity.getPackageName())) {
  62. // 禁用键盘锁(锁屏)
  63. dpm.setKeyguardDisabled(adminComponent, true);
  64. Log.d(TAG, "✅ 锁屏已禁用");
  65. } else {
  66. Log.w(TAG, "⚠️ 不是 Device Owner,无法禁用锁屏");
  67. }
  68. } catch (Exception e) {
  69. Log.e(TAG, "禁用锁屏失败", e);
  70. }
  71. }
  72. /**
  73. * 保持屏幕常亮(常亮会加大耗电,临时方案下不调用)
  74. */
  75. public static void keepScreenOn(Activity activity) {
  76. if (activity == null) {
  77. Log.w(TAG, "Activity is null, cannot keep screen on");
  78. return;
  79. }
  80. try {
  81. activity.getWindow().addFlags(
  82. WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
  83. );
  84. Log.d(TAG, "✅ 屏幕保持常亮");
  85. } catch (Exception e) {
  86. Log.e(TAG, "设置屏幕常亮失败", e);
  87. }
  88. }
  89. /**
  90. * 不设置常亮:清除 FLAG_KEEP_SCREEN_ON,由系统休眠时间(如 50 分钟)控制息屏,降低耗电。
  91. * 临时方案:在 Pad 系统设置中提前设置休眠时间(如 50 分钟),再安装运行 App。
  92. */
  93. public static void clearKeepScreenOn(Activity activity) {
  94. if (activity == null) {
  95. Log.w(TAG, "Activity is null, cannot clear keep screen on");
  96. return;
  97. }
  98. try {
  99. activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  100. Log.d(TAG, "✅ 已关闭常亮,跟随系统休眠时间");
  101. } catch (Exception e) {
  102. Log.e(TAG, "清除常亮标志失败", e);
  103. }
  104. }
  105. /**
  106. * 启用锁屏(恢复系统默认行为)
  107. */
  108. public static void enableLockScreen(Activity activity) {
  109. if (activity == null) {
  110. Log.w(TAG, "Activity is null, cannot enable lock screen");
  111. return;
  112. }
  113. try {
  114. DevicePolicyManager dpm = (DevicePolicyManager)
  115. activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
  116. ComponentName adminComponent = new ComponentName(
  117. activity,
  118. KioskDeviceAdminReceiver.class
  119. );
  120. if (dpm != null && dpm.isDeviceOwnerApp(activity.getPackageName())) {
  121. dpm.setKeyguardDisabled(adminComponent, false);
  122. Log.d(TAG, "✅ 锁屏已启用");
  123. }
  124. } catch (Exception e) {
  125. Log.e(TAG, "启用锁屏失败", e);
  126. }
  127. }
  128. }