fix: turnOn 加 ACQUIRE_CAUSES_WAKEUP 强制唤醒屏幕

FISE广播在屏幕休眠时无法唤醒屏幕硬件(实测验证)。
改为双重机制:
1. WakeLock(FULL+ACQUIRE_CAUSES_WAKEUP+ON_AFTER_RELEASE) 强制唤醒
2. FISE广播同步ROM状态
WakeLock持有3秒后自动释放,释放后由系统超时管理。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
dongliang
2026-04-30 17:30:54 +09:30
parent 80cd6d121e
commit 61412cbd0f

View File

@@ -10,7 +10,12 @@ import javax.inject.Singleton
/** /**
* FISE 定制 ROM 屏幕控制实现 * FISE 定制 ROM 屏幕控制实现
* 通过系统广播控制亮屏/熄屏FISE ROM 特有) * 通过系统广播 + WakeLock 控制亮屏/熄屏
*
* 亮屏使用双重机制:
* 1. ACQUIRE_CAUSES_WAKEUP WakeLock — 强制唤醒屏幕硬件Android 标准方式)
* 2. FISE ROM 广播 — 确保 ROM 层面也同步
* 仅靠 FISE 广播在屏幕休眠时无法唤醒(实测验证)
*/ */
@Singleton @Singleton
class FiseScreenController @Inject constructor( class FiseScreenController @Inject constructor(
@@ -22,17 +27,39 @@ class FiseScreenController @Inject constructor(
private const val ACTION_SCREEN_ON = "com.fise.turn_screen_on" private const val ACTION_SCREEN_ON = "com.fise.turn_screen_on"
/** FISE ROM 熄屏广播 */ /** FISE ROM 熄屏广播 */
private const val ACTION_SCREEN_OFF = "com.fise.turn_screen_off" private const val ACTION_SCREEN_OFF = "com.fise.turn_screen_off"
/** 唤醒 WakeLock 持有时间(毫秒),持有后自动释放 */
private const val WAKE_LOCK_TIMEOUT_MS = 3000L
/** WakeLock tag */
private const val WAKE_LOCK_TAG = "xqwatch:screen_wake"
} }
private val powerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager
/** 获取屏幕是否亮着(通过 PowerManager 标准 API */ /** 获取屏幕是否亮着(通过 PowerManager 标准 API */
override fun isScreenOn(): Boolean { override fun isScreenOn(): Boolean {
val pm = context.getSystemService(Context.POWER_SERVICE) as PowerManager return powerManager.isScreenOn
return pm.isScreenOn
} }
/** 亮屏:发送 FISE ROM 自定义广播 */ /**
* 亮屏WakeLock 唤醒硬件 + FISE 广播同步 ROM 状态
* ACQUIRE_CAUSES_WAKEUP: 即使屏幕休眠也强制点亮
* ON_AFTER_RELEASE: 释放后按系统超时计时(不立即灭)
*/
@Suppress("DEPRECATION") // FULL_WAKE_LOCK 在 API 27 上仍有效
override fun turnOn() { override fun turnOn() {
Timber.d("屏幕控制: 亮屏") Timber.d("屏幕控制: 亮屏")
// 屏幕休眠时需要 WakeLock 强制唤醒硬件
if (!powerManager.isScreenOn) {
val wakeLock = powerManager.newWakeLock(
PowerManager.FULL_WAKE_LOCK
or PowerManager.ACQUIRE_CAUSES_WAKEUP
or PowerManager.ON_AFTER_RELEASE,
WAKE_LOCK_TAG
)
wakeLock.acquire(WAKE_LOCK_TIMEOUT_MS)
Timber.d("屏幕控制: WakeLock 唤醒(${WAKE_LOCK_TIMEOUT_MS}ms后自动释放")
}
// FISE 广播确保 ROM 层面同步
context.sendBroadcast(Intent(ACTION_SCREEN_ON)) context.sendBroadcast(Intent(ACTION_SCREEN_ON))
} }