联系人 phone 个号码 Lync SDK 2013

Contact phone numbers Lync SDK 2013

您好,我正在使用 Lync SDK 2013,在 ListBox 中显示来自联系人的号码 phone,并使用项目(phone 号码)通过我的 [=13= 呼叫此号码].所以我做了一个 WPF 应用程序,它只包含一个列表框和 2 个按钮(呼叫 - 挂断)。我的应用程序被添加为 Lync 中的自定义命令,在联系人的 RightClick 中。而且它没有任何 Lync 控件。所以我想做的是:如果我右键单击联系人,我的应用程序将启动并在列表框中为我提供数字 phone 列表。我用一个包含控件的 WPF 来完成它:ContactSearchInputBox(用于搜索联系人)和 ContactSearchResultList,它工作得很好,我不知道如何在没有控件的情况下做到这一点。 任何人都可以帮助我 !!!! :(

您需要阅读并理解 Lync SDK 2013 Lync Contact 文档。

如果您希望 "simulate" Lync 联系人 "search"(根据客户端搜索),则需要查看 search API

您需要了解的其他概念是 return 从所有 API 编辑的结果不能保证 return 请求的所有 Lync 联系人数据。

Lync SDK 无法"load"所有联系信息,大多数人似乎不理解。

returned 的结果是本地缓存所具有的,仅此而已。要获取所有 Lync 联系人信息,您需要了解 ContactSubscription 模型。

对于您希望收到字段更新(或加载)通知的每个 Lync 联系人,您 "subscribe" 到 Lync 联系人,然后您将通过 Contact.ContactInformationChanged 事件收到通知。

因此您的 UI 必须能够在从任何初始值 return 从任何 Lync Contact 值加载/更新字段时自动更新信息。

public partial class ChoosePhoneNumber : Window
    {
        LyncClient lync_client;
        Contact contact;
        ContactSubscription contact_subscription;
        List<ContactInformationType> contact_information_list;
        ContactManager contact_manager;

        public ChoosePhoneNumber()
        {
            InitializeComponent();

            connect_lync();
            get_subscribed_contact(this.contact);
        }
    }
        private void connect_lync()
        {
            try
            {
                lync_client = LyncClient.GetClient();
                contact_manager = lync_client.ContactManager;
            }
            catch (ClientNotFoundException)
            {
                MessageBox.Show("Client is ot running", "Error While GetClient", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void get_subscribed_contact(Contact contact)
        {
            List<object> contact_phone_numbers_list = new List<object>();
            contact_information_list = new List<ContactInformationType>();
            contact_information_list.Add(ContactInformationType.ContactEndpoints);
            contact_information_list.Add(ContactInformationType.DisplayName);

            contact = contact_manager.GetContactByUri("number"); // I put here the number phone of a contact in my list
            contact_subscription = LyncClient.GetClient().ContactManager.CreateSubscription();
            contact_subscription.AddContact(contact);
            contact.ContactInformationChanged += Contact_ContactInformationChanged;
            contact_subscription.Subscribe(ContactSubscriptionRefreshRate.High, contact_information_list);

            List<object> endpoints = (List<object>)contact.GetContactInformation(ContactInformationType.ContactEndpoints);

            var phone_numbers_list = endpoints.Where<object>(N => ((ContactEndpoint)N).Type == ContactEndpointType.HomePhone ||
            ((ContactEndpoint)N).Type == ContactEndpointType.MobilePhone || ((ContactEndpoint)N).Type == ContactEndpointType.OtherPhone
            || ((ContactEndpoint)N).Type == ContactEndpointType.WorkPhone).ToList<object>();
            var name = contact.GetContactInformation(ContactInformationType.DisplayName);

            if (phone_numbers_list != null)
            {
                foreach (var phone_number in phone_numbers_list)
                {
                    contact_phone_numbers_list.Add(((ContactEndpoint)phone_number).DisplayName);
                }
                conboboxPhoneNumbers.ItemsSource = contact_phone_numbers_list;
            }
        }

        private void Contact_ContactInformationChanged(object sender, ContactInformationChangedEventArgs e)
        {
            var contact = (Contact)sender;
            if (e.ChangedContactInformation.Contains(ContactInformationType.ContactEndpoints))
            {
                update_endpoints(contact);
            }
        }

        private void update_endpoints(Contact contact)
        {
            if ((lync_client != null) && (lync_client.State == ClientState.SignedIn))
            {
                ContactEndpoint endpoints = (ContactEndpoint)contact.GetContactInformation(ContactInformationType.ContactEndpoints);
            }
        }
public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            App.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException; ;
            try
            {
                string argsParam = "Contacts=";

                if (e.Args.Length > 1)
                {
                    if (e.Args[2].Contains(argsParam))
                    {
                        var contacts_sip_uri = e.Args[2].Split('<', '>')[1];
                        Params.contacts = contacts_sip_uri;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Reading Startup Arguments Error - " + ex.Message);
            }

        }

        private void Current_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
        {
            string message = e.Exception.Message;

            if (e.Exception.InnerException != null)
            {
                message += string.Format("{0}Inner Exception: {1}", Environment.NewLine, e.Exception.InnerException.Message);
            }
            MessageBox.Show(message, "Unhandled Exception", MessageBoxButton.OK, MessageBoxImage.Error);
        }

    }

Params 是一个 public 静态 class,它只包含联系人作为 public 静态字符串联系人 { get;放; }

public static class ParamContact
    {
        public static string contacts { get; set; }
    }