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

但是,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

哦,时间到了,开饭。

【WP8.1开发】基于应用的联系人存储的更多相关文章

  1. 随着应用对事务完整性和并发性要求的不断提高,MySQL才开始开发基于事务的存储引擎

    MYSQL 解锁与锁表 - 专注it - 博客园 https://www.cnblogs.com/wanghuaijun/p/5949934.html 2016-10-11 16:50 MYSQL 解 ...

  2. 《Flask Web开发——基于Python的Web应用开发实践》一字一句上机实践(上)

    目录 前言 第1章 安装 第2章 程序的基本结构 第3章 模板 第4章 Web表单 第5章 数据库 第6章 电子邮件 第7章 大型程序的结构   前言 学习Python也有一个半月时间了,学到现在感觉 ...

  3. 基于OceanStor Dorado V3存储之数据保护 Hyper 特性

    基于OceanStor Dorado V3存储之数据保护 Hyper 特性 1.1  快照 1.2  HyperCDP 1.3  HyperCopy 1.4  克隆(HyperClone) 1.5   ...

  4. SSM开发基于Java EE在线图书销售系统

           SSM(Spring+Spring MVC+MyBatis)开发基于Java EE在线图书销售系统  网站成功建立和运行很大部分取决于网站开发前的规划,因此为了在网站建立过程中避免一些不 ...

  5. 基于腾讯云存储COS的ClickHouse数据冷热分层方案

    一.ClickHouse简介 ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS),支持PB级数据量的交互式分析,ClickHouse最初是为YandexMetrica ...

  6. .NET6: 开发基于WPF的摩登三维工业软件 (8) - MVVM

    基于WPF开发界面的一个很大优势是可以方便地基于MVVM设计模式开发应用.本文从应用的角度基于MVVM实现参数化管材的创建界面. 1 MVVM MVVM是Model-View-ViewModel的简写 ...

  7. [Intel Edison开发板] 05、Edison开发基于MRAA实现IO控制,特别是UART通信

    一.前言 下面是本系列文章的前几篇: [Intel Edison开发板] 01.Edison开发板性能简述 [Intel Edison开发板] 02.Edison开发板入门 [Intel Edison ...

  8. Windows Phone 二十一、联系人存储

    联系人资料是手机上必有的,在最新的 Windows Phone 中开放了相应的 API ,以便于应用程序读写通讯录. 注意:系统没有对整个手机自带的通讯录写入开放权限,每个应用只能管理属于当前应用的联 ...

  9. chrome开发总结(交互/权限/存储)-爬虫

    chrome开发总结(交互/权限/存储)-爬虫 [TOC] 标签(空格分隔): 杂乱之地 经过一翻折腾.还是选择了chrome来做爬虫.主要是为了解决一些ajax加载的问题以及代理的问题. 1.chr ...

随机推荐

  1. 8.1 消息通信 EventBus

    EventBus是一个事件发布和订阅的框架.EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Handler,BroadCast 在Fragment,Act ...

  2. java设计模式--简单工厂模式

     简单工厂设计模式 工厂模式就是专门负责将大量有共同接口的类实例化,而且不必事先知道每次是要实例化哪一个类的模式.它定义一个用于创建对象的接口,由子类决定实例化哪一个类. 核心知识点如下: (1) 大 ...

  3. yii2 mpdf

    安装 php composer.phar require kartik-v/yii2-mpdf "*" 或者把 "kartik-v/yii2-mpdf": &q ...

  4. EBS excel模板xml publisher开发

    前提: BI publisher下载地址: http://www.oracle.com/technetwork/middleware/bi-publisher/downloads/index.html ...

  5. mysql5.7 代价模型浅析

    代价模型 mysql 5.7.10代价计算相对之前的版本有5.7 代价模型浅析较大的改进.例如 代价模型参数可以动态配置,可以适应不同的硬件 区分考虑数据在内存和在磁盘中的代价 代价精度提升为浮点型 ...

  6. Icident event 分析

    现象 备库中断,显示如下错误 Connect_Retry: 60 Master_Log_File: mysql-bin.000185 Read_Master_Log_Pos: 308647804 Re ...

  7. MySQL中VARCHAR与CHAR格式数据的区别

    区别 CHAR与VARCHAR类型类似,但它们保存和检索的方式不同.CHAR有固定的长度,而VARCHAR属于可变长的字符类型.它们最大长度和是否尾部空格被保留等方面也不同.在存储和检索过程中不进行大 ...

  8. java 网络(socket)

    本文梳理一个基础的java TCP消息通信,构造一个简单的Packet进行传输,代码如下: Packet public class Packet { private String attribute; ...

  9. chrome的自动缓存真是讨厌。

    最近老是遇到这样一个问题,为什么我的代码改了,页面却一点变化都没有,难道代码错了,打开chrome的调试窗口一看,md,页面根本就没有刷新,逗你爹玩儿呢. 不过幸好,这该死的缓存是可以关闭的. F12 ...

  10. MapReduce原理与设计思想

    简单解释 MapReduce 算法 一个有趣的例子 你想数出一摞牌中有多少张黑桃.直观方式是一张一张检查并且数出有多少张是黑桃? MapReduce方法则是: 给在座的所有玩家中分配这摞牌 让每个玩家 ...