联系可用性 Lync
Posted
技术标签:
【中文标题】联系可用性 Lync【英文标题】:ContactAvailability Lync 【发布时间】:2017-11-15 15:56:32 【问题描述】:我有一个使用 Lync SDK 2013 的应用程序。
我的应用程序与我的手机链接,当我接到电话时,我的 precence Lync 变得忙碌(ContactAvilability.Busy),当我终止呼叫时,我想将我的状态恢复到其原始状态(可用或请勿打扰....)。
我的问题是如何保存我的实际状态,并在我完成通话时返回它??
public static void notify(Call call)
// How to save my current state
if (call.state == Answer)
client.Self.BeginPublishContactInformation(
new Dictionary<PublishableContactInformationType, object>()
PublishableContactInformationType.Availability, ContactAvailability.Busy
, null, null);
else
// where i want to return to my original state
谢谢
【问题讨论】:
【参考方案1】:要保存以前的存在:
_previousPresence = client.Self.Contact.GetContactInformation(new[]
ContactInformationType.Availability,
ContactInformationType.ActivityId,
ContactInformationType.CustomActivity
);
由于“自定义”活动,我们只获得自定义活动本地化字符串而不是自定义活动 ID,因此恢复有点困难。此外,无法恢复“未知”自定义活动(即,未在客户端的自定义活动 xml 文件中定义的自定义活动存在,这可能发生在 UCMA 端点或另一个客户端端点的自定义活动设置未定义在这个客户端上)。在所有情况下准确保存和恢复状态的唯一方法是使用 UCMA 应用程序(服务器或客户端),它可以让您更好地控制状态设置的内容/方式,即对自定义活动状态类型的细粒度控制。
从 Lync 客户端恢复状态的示例:
var publishData = new Dictionary<PublishableContactInformationType, object>
PublishableContactInformationType.Availability, _previousPresence[ContactInformationType.Availability],
PublishableContactInformationType.ActivityId, _previousPresence[ContactInformationType.ActivityId]
;
var customId = FindCustomActivityId(client,
(ContactAvailability)_previousPresence[ContactInformationType.Availability],
((List<object>)_previousPresence[ContactInformationType.CustomActivity]).Cast<LocaleString>().ToList());
if (customId != null)
publishData.Add(PublishableContactInformationType.CustomActivityId, customId);
await Task.Factory.FromAsync(client.Self.BeginPublishContactInformation(publishData, null, null), client.Self.EndPublishContactInformation);
FindCustomActiviyId 有点“黑客”,因为它从先前的存在信息中进行字符串比较搜索不会返回自定义活动 ID,而只会返回自定义活动中的本地化字符串。
private static object FindCustomActivityId(Client client, ContactAvailability availability, IReadOnlyCollection<LocaleString> customActivities)
var currentLcid = System.Globalization.CultureInfo.CurrentUICulture.LCID;
var customStates = client.Self.GetPublishableCustomAvailabilityStates(currentLcid);
if (customStates == null || !customStates.Any())
return null;
var state = customStates.FirstOrDefault(cs => customActivities.Any(ca => cs.Availability == availability && string.Equals(ca.Value, cs.Activity)));
return state?.Id;
您可能还想考虑重叠调用。即您的电话和 Lync 呼叫重叠。在这些情况下,Lync 客户端状态可能已经处于“OnThePhone”忙碌状态。或者,如果在您接听其他电话系统呼叫后状态变为“OnThePhone”。
您还可能希望将忙碌子状态也设置为 OnThePhone,以便其他 Lync 用户知道您正在通话。这是 Lync 客户端在您应答 Lync 客户端呼叫时自动为您执行的操作。
// publish on-the-phone presence
var publishData = new Dictionary<PublishableContactInformationType, object>
PublishableContactInformationType.Availability, ContactAvailability.Busy,
PublishableContactInformationType.ActivityId, "on-the-phone"
;
await Task.Factory.FromAsync(client.Self.BeginPublishContactInformation(publishData, null, null), client.Self.EndPublishContactInformation);
【讨论】:
我的 notify(Call) 在完成之前会经历几个状态。 Ringing => Answer => Terminate ,因此在“Ringing”时,它会保存 _previousPresence 并在 else (call.state != Answer) 中返回此 _previousPresence,好的。但是当我回答时,它会在 _previousPresence 之前保存,然后将状态更改为 Busy(因为 if(call.state == answer) 为真),当我终止通话时,它会在保存 _previousPresence 之前(在这种情况下为 :_previousPresence =忙)然后通过其他,并恢复_previousPresence = Busy。所以在我的通话结束时,存在总是忙碌的。 我不确定我是否遵循您的逻辑。我会在更改存在之前而不是之前的某个时候保存存在。振铃状态可能需要一段时间,同时您的本地 lync 状态可能会发生变化。您的电话系统很可能会经历许多状态,所以不要忘记保持/恢复状态。在某些系统中,恢复状态会再次显示为“已回答”。 非常感谢您的回答和解释。 效果很好。再次感谢。我刚刚检查以保存案例中的 _previousPrecence:Ringings.以上是关于联系可用性 Lync的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# Win 表单应用程序中使用 MS 通信器返回可用联系人列表?
Lync server 2013高可用环境快速查看客户端的版本信息及连接状态