要保存以前的存在:
_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);