fix: 修复SmartMediaProjectionManager权限死循环问题

- 重写onStop回调:添加isCreating()检查和Holder状态判断,避免误判权限丢失
- 重写attemptSilentRecovery():只从Holder获取已有对象,禁止重新创建MediaProjection
- 重写checkAndRestoreExistingPermission():只从Holder获取,不再调用getMediaProjection
- 重写createMediaProjectionSafely():通过safeGetOrCreateProjection统一创建入口
- 与Android15MediaProjectionManager/AccessibilityRemoteService/ScreenCaptureManager/RemoteControlForegroundService的修复配合,彻底消除死循环
This commit is contained in:
wdvipa
2026-02-15 00:37:33 +08:00
parent d163c6fd50
commit 7f77629d39

View File

@@ -490,21 +490,18 @@ class SmartMediaProjectionManager(
} }
/** /**
* 检查并恢复现有权限 * 检查并恢复现有权限 - 只从 Holder 获取已有对象
*/ */
private fun checkAndRestoreExistingPermission() { private fun checkAndRestoreExistingPermission() {
try { try {
val permissionData = MediaProjectionHolder.getPermissionData() // 只从 Holder 获取已有对象,不重新创建
if (permissionData != null) { val existingProjection = MediaProjectionHolder.getMediaProjection()
val (resultCode, resultData) = permissionData if (existingProjection != null) {
if (resultData != null) { Log.i(TAG, "✅ Holder中已有有效MediaProjection直接复用")
Log.i(TAG, "📱 发现现有权限数据,尝试恢复") mediaProjection = existingProjection
val projection = createMediaProjectionSafely(resultCode, resultData) notifyPermissionRecovered()
if (projection != null) { } else {
Log.i(TAG, "✅ 现有权限恢复成功") Log.d(TAG, "📱 Holder中无有效MediaProjection等待权限授予")
notifyPermissionRecovered()
}
}
} }
} catch (e: Exception) { } catch (e: Exception) {
Log.e(TAG, "❌ 检查现有权限失败", e) Log.e(TAG, "❌ 检查现有权限失败", e)