tryHandleMicOccupyDuringScreenShare method

Future<bool> tryHandleMicOccupyDuringScreenShare(
  1. int code
)

屏幕共享中第三方抢麦(1204/1205/1208)时:

  • 不把麦标成永久不可用 / 不上报 busy(避免老师侧显示关麦)
  • 标记中断并异步重建本地采集(defaultMode) 返回 true 表示已按共享场景处理,调用方应跳过常规错误上报。

Implementation

Future<bool> tryHandleMicOccupyDuringScreenShare(int code) async {
  if (!Platform.isAndroid) {
    return false;
  }
  if (!TRTC.isTemporaryMicOccupyCode(code)) {
    return false;
  }
  if (!_trtcStreamInfoObs.isShareScreen.value) {
    return false;
  }

  final micState = _membersInfoObs.selfMicState.value;
  final selfMicOn = micState == StateStatusValueEnum.on;
  // busy/fail 也视为「本应开麦但被占用」,停共享后要自动恢复。
  final micShouldStayOn = selfMicOn ||
      micState == StateStatusValueEnum.busy ||
      micState == StateStatusValueEnum.fail ||
      _pendingMicRestoreAfterScreenShare;
  TRTC.isAudioCaptureInterrupted = true;
  if (micShouldStayOn) {
    _pendingMicRestoreAfterScreenShare = true;
  }
  TCICLog.warn(
    "mic occupy during screen share code=$code micState=$micState "
    "pendingRestore=$_pendingMicRestoreAfterScreenShare, "
    "skip busy report and try recover",
    actionModule: ActionModule.tcicController.name,
    actionName: ActionName.startLocalAudio.name,
  );

  if (!_pendingMicRestoreAfterScreenShare) {
    return true;
  }

  // 异步重试,不阻塞 TRTC 回调线程上的 UI 事件处理。
  unawaited(_recoverMicAfterScreenShareOccupy(code));
  return true;
}