所以当有人打电话给我时,我想获取他的电话号码。
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
没有电话号码属性。
答案 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联系人更新,则会向您发送已订阅信息的更新。
此界面并不是真正用于询问联系信息并获得答案,而是用于连接用户界面元素,以便可以在当前显示用户界面元素时对其进行实时更新。