|
|
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 做得更硬(焦点变化时重挂)。
|
|