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

时间:2018-08-23 14:51:15

标签: c# skype lync skypedeveloper lync-client-sdk

所以当有人打电话给我时,我想获取他的电话号码。

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;

将我从Skype带回到Skype

enter image description here

从电话到Skype

enter image description here

我也尝试使用

inviter.GetContactInformation(ContactInformationType);

但是ContactInformationType没有电话号码属性。

1 个答案:

答案 0 :(得分:1)

您使用GetContactInformation方法来获取ContactEndpoint对象的列表。现在,您可以浏览列表,找到所需的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将返回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联系人更新,则会向您发送已订阅信息的更新。

此界面并不是真正用于询问联系信息并获得答案,而是用于连接用户界面元素,以便可以在当前显示用户界面元素时对其进行实时更新。