fix: 修复setSurface(null)导致MediaProjection session失效
- 移除cleanupVirtualDisplayOnly中的setSurface(null)调用 - 某些设备上setSurface(null)会导致MediaProjection令牌被消耗 - 改为直接release VirtualDisplay后紧接着close ImageReader - 采集循环入口显式重置bufferQueueAbandoned=false
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user