Lync SDK 2013 从来电中获取电话号码

Lync SDK 2013 get phonenumber from incoming call

所以当有人打电话给我时,我想得到他的phone号码。

Contact inviter = conversation.Properties[ConversationProperty.Inviter] as Contact; // The person that is calling
ContactEndpoint inviterContactEndpoint = inviter.Settings[ContactSetting.DefaultContactEndpoint] as ContactEndpoint;

如何获取?

使用这个

string phoneNumber = inviterContactEndpoint.Uri;

returns 我从 Skype 到 Skype

从 phone 到 Skype

我也试过使用

inviter.GetContactInformation(ContactInformationType);

但是ContactInformationType没有phone号码属性。

您使用 GetContactInformation 方法获取所需的 ContactEndpoint objects. Now you can go through the list and find the phone number type 列表。

例如

var contactEndpoints = (Contact.GetContactInformation(ContactInformationType.ContactEndpoints) as List<object> ?? new List<object>()).Select(_ => _ as ContactEndpoint).Where(_ => _ != null);
foreach (var contactEndpoint in contactEndpoints)
{
    switch (contactEndpoint.Type)
    {
        case ContactEndpointType.WorkPhone:
            break;
        case ContactEndpointType.MobilePhone:
            break;
        case ContactEndpointType.HomePhone:
            break;
        case ContactEndpointType.OtherPhone:
            break;
        case ContactEndpointType.Lync:
            break;
        case ContactEndpointType.VoiceMail:
            break;
        case ContactEndpointType.Invalid:
            break;
        default:
            throw new ArgumentOutOfRangeException();
    }
}

现在您将遇到的问题是,对于非缓存联系人,ContactInformationType.ContactEndpoints 将 return 为 null(或空列表,我忘了是哪个)。

所以你需要明白获取这些信息不会同步发生。如果你真的想要这个信息,你需要请求它,它会出现在联系人对象的事件更新中。为此,您需要为所需的详细信息创建联系人订阅,然后为特定联系人订阅订阅。

在应用程序启动时使用客户端 ContactManager 设置订阅:

_contactSubscription = _client.ContactManager.CreateSubscription();
_contactSubscription.Subscribe(ContactSubscriptionRefreshRate.High,
    new[]
        {
            ContactInformationType.ContactEndpoints
        });
            }
            catch (Exception e)
            {
                Log.WriteLine(e);
                _mediator.ClientComConnectionDead();
            }
    }

设置联系人并订阅联系人更改:

contact.ContactInformationChanged += ContactOnContactInformationChanged;
_contactSubscription.AddContact(contact);

处理更新的联系信息:

private void ContactOnContactInformationChanged(object sender, ContactInformationChangedEventArgs e)
{
    if (e.ChangedContactInformation.Any(_ => _ == ContactInformationType.ContactEndpoints))
    {
        var contactEndpoints = (Contact.GetContactInformation(ContactInformationType.ContactEndpoints) as List<object> ?? new List<object>()).Select(_ => _ as ContactEndpoint).Where(_ => _ != null);
        foreach (var contactEndpoint in contactEndpoints)
        {
            switch (contactEndpoint.Type)
            {
                case ContactEndpointType.WorkPhone:
                    break;
                case ContactEndpointType.MobilePhone:
                    break;
                case ContactEndpointType.HomePhone:
                    break;
                case ContactEndpointType.OtherPhone:
                    break;
                case ContactEndpointType.Lync:
                    break;
                case ContactEndpointType.VoiceMail:
                    break;
                case ContactEndpointType.Invalid:
                    break;
                default:
                    throw new ArgumentOutOfRangeException();
            }
        }
    }
}

完成联系人后,您需要摘下并清理:

contact.ContactInformationChanged -= ContactOnContactInformationChanged;
_contactSubscription.RemoveContact(contact);

完成订阅后,您需要在应用程序清理时取消订阅:

_contactSubscription.Unsubscribe();

联系人更新可以随时进行,也可以多次进行,或者如果没有联系人端点则可能根本不更新。后端是 AD 联系信息,因此如果 AD 联系信息更新,您将收到已订阅信息的更新。

这个界面并不是真正用于询问联系信息和得到答复,它更多的是用于连接用户界面元素,以便它们可以在当前显示时实时更新。