【问题标题】:Lync SDK 2013 get phonenumber from incoming callLync SDK 2013 从来电中获取电话号码
【发布时间】:2018-08-23 14:51:15
【问题描述】:

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

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

从手机到 Skype

我也尝试过使用

inviter.GetContactInformation(ContactInformationType);

ContactInformationType 没有电话号码属性。

【问题讨论】:

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


    【解决方案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 联系更新,您将收到您订阅的信息的更新。

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

    【讨论】:

    • 谢谢,但是ContactInformationType.ucPresenceContactEndpoints 不存在,我想我必须接受ContactInformationType.ContactEndpoints。在 switch 语句中,如何从 contactEndpoint 获取电话号码?以及如何从ContactEndpointType.Lync 获取号码?
    • 我刚刚测试了代码,当有人给我打电话或发消息时,事件没有触发。我试图重新创建你的建议,并创建了一个从上到下调用​​堆栈的小例子hastebin.com/mufesotawu.cs 也许我遗漏了一些东西,但我认为这是你建议的代码
    • sorry contactEndpoint 将代表电话号码。但是事件仍然没有触发。
    • 对不起,ContactInformationType.ContactEndpoints 是正确的值,就像你说的那样,我已经编辑了代码。这是一个复制粘贴错误。
    • 该号码以 SIP uri 的形式存在于 ContactEndpoint 的 Uri 属性中,因此电话号码将采用 E164 格式,例如电话:+6491234567 - docs.microsoft.com/en-us/dotnet/api/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 2023-03-22
    • 2012-02-11
    • 1970-01-01
    相关资源
    最近更新 更多