From de91dab53c997059c0bec7c4145bd8be3560ccb0 Mon Sep 17 00:00:00 2001 From: wdvipa Date: Sat, 14 Feb 2026 23:17:24 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DsetSurface(null)?= =?UTF-8?q?=E5=AF=BC=E8=87=B4MediaProjection=20session=E5=A4=B1=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除cleanupVirtualDisplayOnly中的setSurface(null)调用 - 某些设备上setSurface(null)会导致MediaProjection令牌被消耗 - 改为直接release VirtualDisplay后紧接着close ImageReader - 采集循环入口显式重置bufferQueueAbandoned=false --- .../com/hikoncont/manager/ScreenCaptureManager.kt | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/hikoncont/manager/ScreenCaptureManager.kt b/app/src/main/java/com/hikoncont/manager/ScreenCaptureManager.kt index e4aaeb1..fc01b89 100644 --- a/app/src/main/java/com/hikoncont/manager/ScreenCaptureManager.kt +++ b/app/src/main/java/com/hikoncont/manager/ScreenCaptureManager.kt @@ -399,6 +399,7 @@ class ScreenCaptureManager(private val service: AccessibilityRemoteService) { var consecutiveFailures = 0 virtualDisplayRebuildCount = 0 // 重置重建计数 + bufferQueueAbandoned = false // 重置abandoned标志,确保采集循环正常启动 // ✅ 最小有效帧大小阈值:正常480×854 JPEG即使最低质量也>5KB // 低于此值的帧几乎肯定是黑屏/空白帧(VirtualDisplay未刷新) @@ -2260,19 +2261,12 @@ class ScreenCaptureManager(private val service: AccessibilityRemoteService) { */ private fun cleanupVirtualDisplayOnly() { try { - // ✅ 先切断VirtualDisplay与Surface的连接,阻止生产者继续dequeueBuffer - // 这是解决 "BufferQueue has been abandoned" 持续报错的关键 - try { - virtualDisplay?.surface = null - } catch (e: Exception) { - Log.w(TAG, "⚠️ 切断VirtualDisplay Surface连接失败: ${e.message}") - } - - // 释放VirtualDisplay + // 释放VirtualDisplay(停止生产者向Surface写帧) + // 注意:不使用setSurface(null),某些设备上会导致MediaProjection session失效 virtualDisplay?.release() virtualDisplay = null - // 关闭ImageReader(Surface随之销毁) + // 紧接着关闭ImageReader(销毁Surface,生产者自然停止dequeueBuffer) imageReader?.close() imageReader = null