• 【WP8.1开发】基于应用的联系人存储


    上一篇文章所吹的牛是访问系统(手机)上的联系人,当然那只是读不能改,这是自然的,要是让你能随便修改用户的联系人信息的话,那后果很严重,有些恶意开发者就有可能把”你的户口改成猪“。

    但是,API也允许应用程序读写自己的联系人信息,即系统会为某个应用程序分配一个联系人存储区,应用程序可以在其中读写联系人信息。基于应用的联系人存储会集成到系统的”人脉“应用中,也就是说你保存到属于你的应用的联系人会显示在”人脉“应用中。

    用于读写基于应用的联系人的API都位于Windows.Phone.PersonalInformation命名空间中,注意要与上一篇文章中所说的API区分,那个是读取基于系统的联系人信息,而现在所说的API是基于应用本身的。

    该命名空间下的类我就不一一介绍了,我非常讨厌拿个类出来,然后列个表,这个类有什么什么属性,有什么什么方法,有什么什么事件等。我也比较鄙视这样的图书和教程,作者不能拿读者当SB,老从MSDN上抄,所以,不要问我哪个类有哪些成员这种问题,要问你就问MSDN去。

    不过,有两个类很容易搞混,需要解释一下。

    ContactStore:指系统分配给当前应用的联系人存储区,它指的是一个整体。在使用时,调用静态的CreateOrOpenAsync方法就可以返回一个ContactStore实例。如果不存在存储区,系统会进行分配;如果存在,就直接打开。这个方法有一个带参数的重载:

    public static IAsyncOperation<ContactStore> CreateOrOpenAsync(
      ContactStoreSystemAccessMode access, 
      ContactStoreApplicationAccessMode sharing
    )

    access参数指定系统对该存储区的权限,如果为ReadOnly,则系统只能读取该存储区中的联系人,而不能改写,也就是说在”人脉“应用中你不能向当前应用新增联系人,也不能修改。sharing参数指定其他应用对该存储区中联系人的访问权限。

    StoredContact:指的是存储区中某个联系人的信息,它表示的是单个实体。可以通过GetPropertiesAsync方法返回一个字典实例,键是字符串,值为任意类型。该字典用设置联系人的”标准“字段,这些字段可以在”人脉“中显示,如姓、名、电邮地址、手机号、工作电话、住址等。这些字段的名称可以通过KnownContactProperties类的静态属性获取。

    GetExtendedPropertiesAsync方法返回当前联系人的扩展字段的字典实例,这些字段开发者可以自己定义,比如定义一个Key为”RP“的字段,表示该位联系人的人品系数。这些扩展字段只能在我们的应用程序中用代码访问,”人脉“应用中是不显示扩展字段的。

    如果要向存储区中添加新联系人,实例化一个StoredContact对象,然后从GetPropertiesAsync方法获取字段字典,然后根据需要设置对应的值,最后调用StoredContact.SaveAsync方法,联系人就会保存到存储区中,

    那么,要删除联系人呢 ? 调用ContactStore类的DeleteContactAsync方法,参数为联系人的ID(即StoredContact的Id属性)。注意,删除某个联系人是调用DeleteContactAsync方法,如果调用DeleteAsync方法会把系统为应用所分配的整个联系人存储区删除

    理论知识就说到这里,剩下的留给大家自己去体味。下面我做了一个比较简单的示例,当然一个示例是无法示范所有功能的,只做演示之用。示例实现了显示应用联系人存储区中的联系人列表,以及新增联系人两项功能。

    先看如何获取存储区中所有联系人列表。

                ContactStore store = await ContactStore.CreateOrOpenAsync(ContactStoreSystemAccessMode.ReadWrite, ContactStoreApplicationAccessMode.ReadOnly);
                // 创建查询
                ContactQueryResult qry = store.CreateContactQuery();
                // 获取所有联系人
                var contacts = await qry.GetContactsAsync();
                lvContacts.ItemsSource = contacts;

    获取联系人列表是通过”查询“对象来访问的,CreateContactQuery返回一个ContactQueryResult实例,姑且叫它”查询结果“。通过这个查询结果,我们可以调用GetContactsAsync返回联系人列表。

    下面是新增联系人的代码。

                ContactStore store = await ContactStore.CreateOrOpenAsync(ContactStoreSystemAccessMode.ReadWrite, ContactStoreApplicationAccessMode.ReadOnly);
                // 创建联系人
                StoredContact contact = new StoredContact(store);
                // 设置字段
                IDictionary<string, object> sets = await contact.GetPropertiesAsync();
                sets[KnownContactProperties.GivenName] = txtName.Text;
                sets[KnownContactProperties.Email] = txtEmail.Text;
                sets[KnownContactProperties.CompanyName] = txtComp.Text;
                sets[KnownContactProperties.Telephone] = txtPhone.Text;
                // 保存
                await contact.SaveAsync();

    要记住的是,在设置完新联系人的各个字段值后,要调用SaveAsync方法来保存联系人,不然就等于白劳动了。

    最后一步,就是在清单文件中配置权限。在”功能“选项卡下勾选”联系人“,然后保存。

    最后可以看看结果图。

      

    示例的源码下载:http://files.cnblogs.com/tcjiaan/ContactOnAppSample.zip

    哦,时间到了,开饭。

  • 相关阅读:
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    set IDENTITY_INSERT on 和 off 的设置
    导入本地Excel到DataSet中
    SQL结果统计 GROUP BY
    算法:10幢房子分给3个人
  • 原文地址:https://www.cnblogs.com/tcjiaan/p/4176333.html
Copyright © 2020-2023  润新知