【WP8.1开发】选择与搜索联系人

在需要的情况下,可以通过相关的API来访问手机上的联系人信息;当然,在不必要的情况下,不要随便去获取别人的数据。

要从联系人列表中选择并获取一位或者N位联系人的详细信息,比较简单的做法是利用ContactPicker。该类会弹出系统集成的联系人选择界面,用户直接通过界面操作选择需要的联系人。当用户做出选择后,会将选择结果返回给调用方。

一位联系人的具体信息由Contact类封装,比如手机号码、姓名、住址等,有关该类的具体成员我就不一一说了,那样多没意思,用VS的人都应该经常打开“对象浏览器”窗口玩玩,这个窗口非常好玩,经常会遇到不少人老喜欢问:XXX类在哪个命名空间下? 岂有此理!你是第一天用VS吗? 自己不会打开“对象浏览器”去看看吗? 所以,以后我的博文中不会再告诉你某个类在哪个命名空间下,你自己要知道如何去找。

使用ContactPicker类来选择联系人非常简单,用下面的例子演示一下你就会明白了。

这个例子用两个RadioButton控件做选择,即选择单个联系人还是选择多个。

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <StackPanel Orientation="Vertical">
            <Button Content="选择联系人" Click="PickContacts"/>
            <RadioButton Name="rdbSingle" Content="选择单个"  IsChecked="True" GroupName="g1"/>
            <RadioButton Name="rdbMulti" Content="选择多个" GroupName="g1"/>
        </StackPanel>
        <ListBox Name="lb" Grid.Row="1" Margin="5">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Foreground="Green" FontSize="26" Text="{Binding DisplayName}"/>
                        <ItemsControl Margin="7,0,0,0" ItemsSource="{Binding Phones }">
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <TextBlock FontSize="20">
                                        手机:<Run Text="{Binding Number}"/>
                                    </TextBlock>
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>

ListBox控件用来显示被选择的联系人的信息,例子中,我只显示DisplayName(显示名)和Phones(手机号码列表)两个字段,其他就不列举了,这样简洁一点。
下面代码将使用ContactPicker来选择联系人。

            ContactPicker _contactPicker = new ContactPicker();
            // 必须设置以下项
            _contactPicker.DesiredFieldsWithContactFieldType.Add(ContactFieldType.PhoneNumber);
            // 选择单个联系人
            if (rdbSingle.IsChecked == true)
            {
                Contact singleContact = await _contactPicker.PickContactAsync();
                if (singleContact != null)
                {
                    IList<Contact> contacts = new List<Contact>();
                    contacts.Add(singleContact);
                    lb.ItemsSource = contacts;
                }
            }
            // 选择多个联系人
            if (rdbMulti.IsChecked == true)
            {
                lb.ItemsSource = await _contactPicker.PickContactsAsync();
            }

建议在每次使用的时候才实例化ContactPicker,不要在页面类级别实例化,因为当用户选择完联系人后,系统会将ContactPicker实例中的某些内容清理,当第二次访问时就会发生异常。我们知道,RT的API其实是以COM形式出现的,只是用托管代码进行了封装。
说到这里,又想起一件事,前不久看到有人怀疑WPF是否被RT取代的言论。其实那不准,RT程序主要面向像ARM一些移动CPU的,或者说它专用于移动终端平台,像平板手机等;而WPF是用于桌面环境的,之所以会从WPF产生像RT这样的子集,就是考虑到移动终端是不能和桌面系统相比的,CPU架构也存在不同。哪怕是相同参数的CPU,移动版的性能其实是缩水的,不能与PC上的CPU比,应该要区分它们的用途。

不管怎样,.net上的各种东西都是一脉相承的,你只要有扎实的WPF基础,那么在Silverligt、RT等内容上你几乎不需要学习就可以马上开工。任何事物都是处于不断变化之中,.NET不管它怎么更新,其主要的东西是不变的,所以有些人总感觉学习成本高。我告诉你,你觉得学习成本高,那是因为你本身基础就不扎实,而且这种不扎实还会随着时间一点一点地积累的。如果你在学习.net的时候注重打基本功,无论它怎么变,对你来说影响是不大的,要学会知识迁移

我用一句话总结一下,学会以下几个东西,基本上.net就没问题了——编程语言基础 + WCF、WPF、ASP.NET。

不扯废话了,回归话题。在ContactPicker的时候,有两个方法可以选择:

1、PickContactAsync:只选择一个联系人,返回单个Contact实例。

2、PickContactsAsync:多选。返回一个Contact列表,表示已被选择的联系人。

以下代码是必须的,如果没有会发生异常:

// 必须设置以下项
            _contactPicker.DesiredFieldsWithContactFieldType.Add(ContactFieldType.PhoneNumber);

ContactFieldType指定以什么类型去选取联系人,你至少要Add一个,我这里只用到PhoneNumber,表示选择是以联系人的电话号码为基准的,如果是Email,就表示以选取电邮地址为基准,通常是选择电话号码多一些。

现在,可以测试一下。

      

===================================================

以上方法尽管比吃西瓜还简单,但似乎缺少了些灵活性。尤其是我们希望想通过自己设计的UI来显示、查找联系人的时候,就不应该再使用系统默认的选择器。

因此,可以使用另一种方法来获取联系人信息,这种方法是”无界面“的,而是直接通过代码来获取,这样我们可以自己来设计显示联系人列表的界面,或者可以加入自己的搜索功能。

ContactStore公开以下几个方法,可以获取联系人信息。

FindContactsAsync:方法有两个重载,不带任何参数的重载将获取所有联系人;带一个string参数的版本可以根据参数进行搜索,比如,联系人列表存在以下三个人:毛线、毛丫子、苟毛,那么当调用FindContactsAsync方法并把字符串”毛“传递进去后,就会返回这三个联系人信息。

利用这点,我们就可以实现自己的搜索功能。比如下面XAML:

                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="auto"/>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>
                    <TextBox Name="txtInput" TextChanged="OnTextChanged"/>
                    <ListView x:Name="lv" Grid.Row="1" ItemClick="OnItemClick" IsItemClickEnabled="True">
                        <ListView.ItemTemplate>
                            <DataTemplate>
                                <TextBlock FontSize="24" Text="{Binding DisplayName}"/>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>
                </Grid>

TextBox用于输入搜索关键字,通过处理TextChanged事件,可以在输入的文本发生变化后立即完成搜索,并将搜到的结果显示在ListView控件中。ListView中只显示搜到的联系人的显示名,当用户点击ListView中的项时,会把该联系人的ID、姓名、手机号码显示在TextBlock中。

        private async void OnTextChanged ( object sender, TextChangedEventArgs e )
        {
            IReadOnlyList<Contact> contacts = null;
            if (string.IsNullOrWhiteSpace(txtInput.Text))
            {
                // 如果输入为空,就查找所有联系人
                contacts = await _store.FindContactsAsync();
            }
            else
            {
               contacts = await _store.FindContactsAsync(txtInput.Text);
            }
            lv.ItemsSource = contacts;
        }

ContactStore类在使用前并不能直接实例化,它是通过ContactManager类的RequestStoreAsync静态方法返回。

_store = await ContactManager.RequestStoreAsync();

使用这种方法获取联系人信息,请必须打开清单文件,在”功能“选项卡下勾选”联系人“,然后保存,否则应用程序无权限访问联系人。

好了,现在再看看这个例子的结果。

    

下面是本文两个示例的源代码下载地址:

http://files.cnblogs.com/tcjiaan/sampleSrcs.zip

关于联系人管理,下一篇文章再向大家介绍有点复杂的第三种方案。

时间: 2024-10-11 09:01:24

【WP8.1开发】选择与搜索联系人的相关文章

Android之开源类库Pinyin4j的使用----搜索联系人

Pinyin4j只能算是Java开源类库,但是在Android的应用开发中也经常被用到.大家都用过手机的通讯录,通讯录的搜索联系人的功能,用pinyin4j就可以实现.下面我给大家带来这个例子,使用pinyin4j实现搜索联系人功能. 首先先对pinyin4j做一个简单的介绍: pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换,拼音的输出格式也可以定制,并且支持汉字的多音字.pinyin4j的官方网是:http://pinyin4j.sourceforge.net/ piny

WP8.1开发:简单的天气预报应用

今天小梦给大家分享一个简单的天气预报应用源码:调用的是百度API.整个应用都没有什么难点.只是一个简单的网络请求和json数据处理.在WP8.1有小娜的情况下,天气预报应用还有意义吗?我认为还是有点意义的,至少数据更详细,而要想要用户喜欢,必须有比小娜更人性化的提醒和精美的UI.UI必须要精美.当然小梦今天分享的UI很简单.大家可以根据自己的想象去处理UI.之所以分享出来,是分享JSON的数据处理.在WP8.1开发XML读取中央气象城市代码文件中,分享了XML文件和JSON数据解析的方法,不过其

如何开发自己的搜索帝国之ES图形化Kibana安装与使用

在如何开发自己的搜索帝国之Elasticsearch中已经介绍安装好了ES,下面就Kibana对ES的查询监控作介绍,就是常提到的大数据日志处理组件ELK里的K. 什么是Kibana?现引用园友的一段对此的介绍,个人觉得比较全. Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索.查看交互存储在Elasticsearch索引中的数据.使用Kibana,可以通过各种图表进行高级数据分析及展示. Kibana让海量数据更容易理解.它操作简单,基于浏览器的用户界面可以快速

WP8.1开发:简单天气预报应用(转)

今天小梦给大家分享一个简单的天气预报应用源码:调用的是百度API.整个应用都没有什么难点.只是一个简单的网络请求和json数据处理.在WP8.1有小娜的情况下,天气预报应用还有意义吗?我认为还是有点意义的,至少数据更详细,而要想要用户喜欢,必须有比小娜更人性化的提醒和精美的UI.UI必须要精美.当然小梦今天分享的UI很简单.大家可以根据自己的想象去处理UI.之所以分享出来,是分享JSON的数据处理.在WP8.1开发XML读取中央气象城市代码文件中,分享了XML文件和JSON数据解析的方法,不过其

仿IOS通讯录效果,实现获取手机通讯录、字母排序显示、搜索联系人、拨打电话

1.使用UITableView,实现联系人字母排序.点击字母跳转显示联系人组目录: 2.使用UISearchController,实现联系搜索,动态显示符合查询的联系人: 3.点击通讯录列表项,显示联系人信息(使用自定义模式化窗口类似与UIAlertView,使用UIwindow实现),点击拨号,可以直接拨打电话: 4.实现获取手机通讯录里面的联系人信息: 详情见资源:http://download.csdn.net/detail/u011622479/9505751 效果图如下: 获取联系人:

OpenERP(odoo)开发实例之搜索检索过去3个月的数据

转自:http://www.chinamaker.net/ OpenERP(odoo)开发实例之搜索过滤:检索过去3个月的数据 解决这个问题的重点在于 relativedelta 的应用 示例代码如下: 1: <!-- filter: last three months --> 2: <filter icon="terp-personal" name="last_three_month" 3: string="Last 3 Months&

解决:People下面选择分享可见联系人,选择多个联系人后通过短信分享,短信中只显示一个联系人

问题描述: [操作步骤]:People下导入导出中选择分享可见联系人,选择多个联系人后通过短信分享 [测试结果]:短信中只能显示一个联系人 [预期结果]:可以显示多个联系人 经过代码分析,从compose_message_activitu.xml中的ViewStub进行定位到现实联系人名片的视图: <ViewStub android:id="@+id/vcard_attachment_view_stub" android:layout="@layout/vcard_at

搜索联系人是去掉拼音中的空格

在搜索联系人时,因为存储进数据库的字段中含有空格,造成在按拼音搜索联系人的时候也必须加入空格,很不方便,所以今天请教大神,在从解析数据的时候就将名字转为拼音,去掉空格,所以在解析时候使用如下代码红色标记的那段: - (void)syncContact { dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_sync(queue, ^{ NSUserDefa

新大番薯棋牌牛牛源码安装搭建 微信h5牛牛大厅开发选择方式

一个完整的客户端棋牌游戏从结构上包括了游戏.游戏大厅.游戏网站.客户端等部分,如果把做棋牌游戏比作建房子,那打造一个自己的棋牌之家就得经过前期的规划设计,中期的建筑施工,后期的装修设计等环节,有的人建房子可能会亲力亲为,有的人为了省钱而去购买小产权房或二手房,更多的人则选择开发商购买商品房.本质上,做棋牌游戏基本也是如此,无论个人还是团队企业,在当前日渐成熟的网络棋牌游戏市场,新大番薯棋牌牛牛源码安装搭建(h5.maliwl.com) 微信h5牛牛大厅开发选择方式   ,要想涉足无非也是以下这几