1

我有一个使用 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 
            }
        }

谢谢

4

1 回答 1

0

要保存以前的存在:

_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);
于 2017-11-15T21:49:53.927 回答