fix: 修复setSurface(null)导致MediaProjection session失效

- 移除cleanupVirtualDisplayOnly中的setSurface(null)调用
- 某些设备上setSurface(null)会导致MediaProjection令牌被消耗
- 改为直接release VirtualDisplay后紧接着close ImageReader
- 采集循环入口显式重置bufferQueueAbandoned=false
This commit is contained in:
wdvipa
2026-02-14 23:17:24 +08:00
parent 3ba594aa9f
commit de91dab53c

View File

@@ -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
// 关闭ImageReaderSurface随之销毁
// 紧接着关闭ImageReader销毁Surface生产者自然停止dequeueBuffer
imageReader?.close()
imageReader = null