联系人可用性 Lync

ContactAvailability Lync

我有一个使用 Lync SDK 2013 的应用程序。

我的应用程序与我的 phone 相关联,当我接到电话时,我的 precence Lync 变得忙碌 (ContactAvilability.Busy),当我终止通话时,我想 return我的状态恢复到原来的状态(有空或请勿打扰....)。

我的问题是如何保存我的实际状态,并在我完成通话后 return 保存它??

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 
            }
        }

谢谢

要保存以前的状态:

_previousPresence = client.Self.Contact.GetContactInformation(new[]
{
    ContactInformationType.Availability,
    ContactInformationType.ActivityId,
    ContactInformationType.CustomActivity
});

恢复有点困难,因为 "Custom" activity 我们只得到自定义 activity 本地化字符串,而不是自定义 activity id。此外,也无法恢复 "unknown" 自定义 activity(即未在客户端的自定义活动 xml 文件中定义的自定义 activity 存在,这可能会发生其中 UCMA 端点或另一个客户端端点具有未在此客户端上定义的自定义活动设置)。在所有情况下准确保存和恢复状态的唯一方法是使用 UCMA 应用程序(服务器或客户端),它可以让您更好地控制 what/how 状态设置,即对自定义 activity 的细粒度控制存在类型。

从 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 有点像 "hack",因为它根据先前的存在信息进行字符串比较搜索不会返回自定义 activity id,而只会返回自定义的本地化字符串activity.

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;
}

您可能还想考虑重叠调用。即您的 phone 呼叫和 Lync 呼叫重叠。在这些情况下,Lync 客户端状态可能已经处于 "OnThePhone" 忙碌状态。或者,如果在您回答其他 phone 系统调用后状态更改为 "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);