0

我对 Lync 2013 SDK 相当陌生(现在已经使用了几个星期)并且已经能够弄清楚我需要的几乎所有东西,除了这个......

当我加入一个会议(使用 ConversationManager.JoinConference())时,它可以正常加入。但是,在某些情况下(不是全部),我想在会议上连接 AVModality。有时它可以工作,有时它只是位于“正在连接”中并且从不连接(即使我已经调用了 EndConnect)。

我发现 Skype 的选项 -> Skype 会议 -> 加入电话会议部分中的设置似乎覆盖了我的代码。也许是比赛条件?

当设置为“不加入音频”和“在我加入会议之前,询问我要使用哪个音频设备”时未选中(意味着我加入时没有提示):会议加入,AVModality 断开连接 ->连接 -> 断开连接。然后我的代码触发 BeginConnect 并且 AVModality 断开连接 - > 连接 - 并且永远不会解决(有时我会听到快速忙音音频)。

当“在我加入会议之前,询问我要使用哪个音频设备”被选中时(意味着我收到提示):会议加入,提示询问如何连接,如果我选择 Skype for business - 它连接音频正常(预期的)。有趣的是,如果我使用 Lync UI 挂断电话(AVModality 转为断开连接),它会立即重新连接(假设我的 BeginConnect 这样做)。

这是真正令人费解的地方:如果我在 ModalityStateChanged 事件处理程序中的 AVmodality 上的状态为 Connecting 时调用 BeginConnect ......会发生以下情况:会议加入,提示询问我如何连接(此时 AVmodality 状态为“正在连接”直到根据提示做出决定)-这意味着我的 BeginConnect 触发。然后,如果我在提示中选择“不加入音频”... AVModality 状态变为 Connecting -> Disconnected -> Connecting -> Joining -> Connected。所以 - 我的 BeginConnect 已经在进行中并且在这种情况下仍然可以工作,只要它在选择“不加入音频”之前触发。

所以我想知道“不加入音频”选择(无论是否有提示)实际上是否在某些东西上设置了一些其他属性,从而阻止 AVModality 在那之后连接而不做一些额外的恶作剧?如果是这样 - 我想知道我需要执行的额外恶作剧:)

感谢您的任何帮助!

4

2 回答 2

1

归根结底……会议加入是否加入音频 - 我已经处理了除一个之外的所有场景,我仍然无法弄清楚:1.我需要加入会议音频,但是用户选择不加入音频(在提示中或从 Skype 选项设置中)。

在这种情况下 - 我已向模态状态更改事件添加了一个事件处理程序,当 NewState == Disconnected 时,我在模态本身上触发 BeginConnect。这工作正常。在回调中,我有 EndConnect 调用。但是 - AVModality 状态继续保持在“正在连接”并且永远不会解析为已连接。在 UI 上 - 它显示音频按钮,但全部显示为灰色(连接时正常)。我不确定如何使它完成连接?

这是一段代码:

    if (merge)
            {
                myHandler = delegate (object sender1, ModalityStateChangedEventArgs e1)
                {
                    AVModality avModality = (AVModality)sender1;
                    Globals.ThisAddIn.confConvo = avModality.Conversation;
                    if (e1.NewState == ModalityState.Connected)
                    {                            
                        DialNumberInSkype(meetingInfo);
                        avModality.ModalityStateChanged -= myHandler;
                    }
                    if (e1.NewState == ModalityState.Disconnected)
                    {
                        object[] asyncState = { avModality, "CONNECT" };
                        avModality.BeginConnect((ar) =>
                        {
                            avModality.EndConnect(ar);
                            DialNumberInSkype(meetingInfo);
                        }, asyncState);
                        avModality.ModalityStateChanged -= myHandler;
                    }
                };
            }

编辑: 出于某种原因,我现在无法添加评论...

我尝试按照您的建议设置端点。但是,我收到 ArgumentException 错误“值不在预期范围内”。因此,我尝试将 CreateContactEndpoint 中的 uri 值硬编码为“sip:my_login@domain.com”(当然实际值除外) - 并得到了相同的 ArgumentException 错误。我在此之前添加了一个断点,并且能够看到 avModality.Endpoint 的值 - 它实际上一直设置给我......当我尝试调用 BeginConnect 时它不是 null 或未设置。

于 2016-09-21T14:36:25.597 回答
0

当调用 JoinConference() 时,即使没有显式调用 BeginConnect(),也会连接音频模态。

当提示要求选择音频设备时(当在 Skype 中设置加入选项前询问时)对话属性 ConferenceEscalationProgress 将具有值 AwaitingJoinDialogResponse。

将对话属性 ConferenceJoinDialogCompleted 设置为 true 将启动 Modality 连接,即使提示未关闭。

已编辑

如果选择不加入音频,模态将被断开,此时您正在尝试调用 BeginConnect()。在调用 BeginConnect() 之前尝试设置模态端点。

conversation.Modalities[ModalityTypes.AudioVideo].Endpoint = lyncClient.Self.Contact.CreateContactEndpoint(lyncClient.Self.Contact.Uri);
于 2016-08-25T14:06:38.267 回答