fix: 修复屏幕录制权限频繁掉落问题

- 根因:多处代码重复调用getMediaProjection()创建新实例,系统自动stop旧实例触发onStop回调,形成权限丢失恢复再丢失的死循环
- ScreenCaptureManager.ensureMediaProjection():禁止重复创建,只从Holder获取已有对象
- ScreenCaptureManager.captureWithMediaProjection():移除重复创建逻辑
- ScreenCaptureManager.triggerPermissionRecovery():优先从Holder和SmartManager获取已有对象
- ScreenCaptureManager.regenerateMediaProjectionForAndroid15():优先复用Holder中已有对象
- SmartMediaProjectionManager.attemptSilentRecovery():先检查Holder是否已有有效对象
- Android15MediaProjectionManager.attemptSilentRecovery():先检查Holder复用已有对象
- Android15MediaProjectionManager.determineStopReason():修复误判逻辑,Holder中仍有有效对象时识别为旧实例被替换而非用户主动停止
- AccessibilityRemoteService.attemptAndroid15SilentRecovery():优先复用Holder中已有对象
- AccessibilityRemoteService.handleMediaProjectionGranted():Android 11+优先从Holder获取
- RemoteControlForegroundService.handleStartMediaProjection():优先检查Holder避免重复创建
This commit is contained in:
wdvipa
2026-02-15 00:22:47 +08:00
parent de9aa4430c
commit 39bc5b47a0
5 changed files with 161 additions and 175 deletions

View File

@@ -263,6 +263,9 @@ class SmartMediaProjectionManager(
/**
* 尝试静默恢复
*
* 🚨 核心修复:优先检查 Holder 中是否已有有效对象,
* 避免重复调用 getMediaProjection() 创建新实例导致旧实例被 stop
*/
private suspend fun attemptSilentRecovery(): Boolean {
val currentAttempts = silentRecoveryAttempts.get()
@@ -279,7 +282,17 @@ class SmartMediaProjectionManager(
// 延迟恢复,避免与系统操作冲突
delay(SILENT_RECOVERY_DELAY)
// 检查权限数据是否仍然有效
// ✅ 优先检查 Holder 中是否已有有效的 MediaProjection 对象
val existingProjection = MediaProjectionHolder.getMediaProjection()
if (existingProjection != null) {
Log.i(TAG, "✅ Holder中已有有效MediaProjection直接复用")
mediaProjection = existingProjection
notifyPermissionRecovered()
resetRecoveryCounters()
return true
}
// Holder 中无有效对象,尝试从权限数据重新创建(仅一次)
val permissionData = MediaProjectionHolder.getPermissionData()
if (permissionData != null) {
val (resultCode, resultData) = permissionData