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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user