|
videorecorder 拓展红米手机仍然息屏:动态伪交互,模拟操作; 检测并提示用户关闭省电 这2个方向如何? ● 两个方向我都仔细评估了一下,结论差别很大:方向1基本是死路,方向2是对的路但只能"引 导"不能"代劳"。而且在动手之前,我还是想先把那个关键前提说清楚。 方向1:动态伪交互 / 模拟操作 —— ❌ 不可行,建议放弃 核心问题:普通 App(扩展)根本碰不到"重置系统息屏计时器"的开关。 - 真正能阻止息屏的系统调用是 PowerManager.userActivity(...) —— 它需要 android.permission.DEVICE_POWER(signature|system 级),普通应用申请不到,调用直接抛 SecurityException。 - 注入系统输入事件(让系统以为"用户在点屏")需要 android.permission.INJECT_EVENTS(同样 signature 级);adb shell input tap 要 shell/root —— 扩展都拿不到。 - 你能在自己 App 内给自己的 View 派发 MotionEvent、跑个 1px 动画 —— 但这些不会走到系统的 InputDispatcher,根本不重置息屏计时器(渲染/自派发事件 ≠ 用户活动)。所以"伪交互"在物理上就达不到目的。 - 退一步:就算能做,也是高耗电、脆弱,而且 MIUI 恰恰会主动检测并压制这类"假活跃"行为;更关键的是 —— 如果现在 FLAG_KEEP_SCREEN_ON 都压不住,说明很可能是 MIUI 策略层强行息屏(下面的 B 类),那连 userActivity 都救不了,伪交互更没用。 → 这个方向不用花时间了。 方向2:检测并提示用户关省电 —— ✅ 正确方向,但有边界 这是应对"MIUI 策略层覆盖"的唯一现实手段。能做 / 不能做要分清: 能做(都是普通应用合法 API): - 判机型:Build.MANUFACTURER/BRAND 含 xiaomi/redmi/poco,或读 ro.miui.ui.version.name → 判定是否 MIUI/HyperOS,只对小米用户弹引导。 - 查状态:PowerManager.isIgnoringBatteryOptimizations(包名)(API23+)判断是否已被电池优化豁免。 - 跳设置页引导:最稳的是Settings.ACTION_APPLICATION_DETAILS_SETTINGS(package:包名)→落到"应用详情页",再用文字引导用户开:省电策略=无限制、锁屏显示、自启动。 不能做(要诚实告诉用户): - 没有 API 能替用户把省电关掉 —— 只能"检测 + 跳转 + 文字引导",最后一步必须用户手点。 - Android 标准的 isIgnoringBatteryOptimizations / REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 在 MIUI 上只反映一半:它管的是 Google的电池优化,而真正息屏你的多半是 MIUI自家的"省电策略/锁屏显示/自启动",两者是两套东西。 - 别硬编码 MIUI 的隐藏设置 Activity(如 com.miui.powerkeeper/...):换版本就 ActivityNotFound/SecurityException,HyperOS 上很多已封。要做也只能"试 MIUI专属页,失败回退到应用详情页"。 → 建议形态:加 IsScreenKeepReliable()/IsBatteryOptimized() 查询 + OpenPowerSettings() 跳转 + 一个一次性引导事件;并在文档写清 MIUI 注意事项。同时把 FLAG_KEEP_SCREEN_ON 做得更硬(焦点变化时重挂)。 |
GMT+8, 2026-07-03 10:55 , Processed in 0.033903 second(s), 34 queries .