package com.YuyeTech.HeartRate; import android.app.Activity; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Context; import android.util.Log; import android.view.WindowManager; import com.ble.mylockview.admin.KioskDeviceAdminReceiver; /** * Kiosk 辅助类 - 提供禁用锁屏、屏幕常亮等功能 * Created on 2026/1/22. */ public class KioskHelper { private static final String TAG = "KioskHelper"; /** * 仅用 Context 禁用锁屏(Device Owner 时生效)。 * 用于在 Application 或 BootReceiver 中尽早调用,避免开机自启时处于锁屏阶段导致 * 输入法(IME)无法挂载或显示、被 Keyguard 层级遮挡的问题。 * 调用时机:Application.onCreate() 或 BOOT_COMPLETED/LOCKED_BOOT_COMPLETED 收到时。 */ public static void disableKeyguardIfOwner(Context context) { if (context == null) { Log.w(TAG, "Context is null, cannot disable keyguard"); return; } try { Context app = context.getApplicationContext(); DevicePolicyManager dpm = (DevicePolicyManager) app.getSystemService(Context.DEVICE_POLICY_SERVICE); ComponentName adminComponent = new ComponentName(app, KioskDeviceAdminReceiver.class); if (dpm != null && dpm.isDeviceOwnerApp(app.getPackageName())) { dpm.setKeyguardDisabled(adminComponent, true); Log.d(TAG, "✅ 锁屏已禁用(Application/开机阶段)"); } } catch (Exception e) { Log.e(TAG, "disableKeyguardIfOwner 失败", e); } } /** * 禁用锁屏和解锁屏幕(在 Activity 创建时调用) */ public static void disableLockScreen(Activity activity) { if (activity == null) { Log.w(TAG, "Activity is null, cannot disable lock screen"); return; } try { // 1. 解锁屏幕(如果当前是锁定状态) activity.getWindow().addFlags( WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON ); // 2. 作为 Device Owner 禁用锁屏 DevicePolicyManager dpm = (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE); ComponentName adminComponent = new ComponentName( activity, KioskDeviceAdminReceiver.class ); if (dpm != null && dpm.isDeviceOwnerApp(activity.getPackageName())) { // 禁用键盘锁(锁屏) dpm.setKeyguardDisabled(adminComponent, true); Log.d(TAG, "✅ 锁屏已禁用"); } else { Log.w(TAG, "⚠️ 不是 Device Owner,无法禁用锁屏"); } } catch (Exception e) { Log.e(TAG, "禁用锁屏失败", e); } } /** * 保持屏幕常亮(常亮会加大耗电,临时方案下不调用) */ public static void keepScreenOn(Activity activity) { if (activity == null) { Log.w(TAG, "Activity is null, cannot keep screen on"); return; } try { activity.getWindow().addFlags( WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON ); Log.d(TAG, "✅ 屏幕保持常亮"); } catch (Exception e) { Log.e(TAG, "设置屏幕常亮失败", e); } } /** * 不设置常亮:清除 FLAG_KEEP_SCREEN_ON,由系统休眠时间(如 50 分钟)控制息屏,降低耗电。 * 临时方案:在 Pad 系统设置中提前设置休眠时间(如 50 分钟),再安装运行 App。 */ public static void clearKeepScreenOn(Activity activity) { if (activity == null) { Log.w(TAG, "Activity is null, cannot clear keep screen on"); return; } try { activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); Log.d(TAG, "✅ 已关闭常亮,跟随系统休眠时间"); } catch (Exception e) { Log.e(TAG, "清除常亮标志失败", e); } } /** * 启用锁屏(恢复系统默认行为) */ public static void enableLockScreen(Activity activity) { if (activity == null) { Log.w(TAG, "Activity is null, cannot enable lock screen"); return; } try { DevicePolicyManager dpm = (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE); ComponentName adminComponent = new ComponentName( activity, KioskDeviceAdminReceiver.class ); if (dpm != null && dpm.isDeviceOwnerApp(activity.getPackageName())) { dpm.setKeyguardDisabled(adminComponent, false); Log.d(TAG, "✅ 锁屏已启用"); } } catch (Exception e) { Log.e(TAG, "启用锁屏失败", e); } } }