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

但是,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. UE4动作流程总结

    右键新窗口打开看大图

  2. ORA-00060:等待资源时检测到死锁的一种处理方法

    先执行脚本: SELECT p.sipid, a.serial#, c.object_name, b.session_id, b.oracle_username, b.os_user_name FRO ...

  3. <input type="file"> change事件异常处理办法

    问题:最近发现一个奇怪的bug, 那就是在上传图片需要采用input type=file来进行文件选择.由于为了适应美工的UI图,所以是把选择文件的input框隐藏了.然后通过另外一个按钮的点击事件来 ...

  4. C++学习心得

    从大一的学习中,我了解到C++是兼容C的面向过程和面向对象的程序设计语言.其中,面向对象程序设计方法是以对象为模板的结构化程序设计方法,是对结构化程序设计方法的继承和发展.刚开始的学习让我觉得特别吃力 ...

  5. mysql 条件统计

    问题描述为使讨论简单易懂,我将问题稍作简化,去掉诸多的背景. 从前有一个皇帝,他有50个妃子,这些妃子很没有天理的给他生了100,000个儿子,于是,皇帝很苦恼,海量的儿子很难管理,而且,他想知道每个 ...

  6. 理解一下单片机的I2C和SPI通信

    应某位网友要求,今天说一下单片机的I2C SPI通信,可能说不清楚,因为这毕竟要做实验才可完全理解. I2C和SPI是两种不同的通信协议. 听到协议,似乎高不可攀,其实协议就是人们定义的一个标准而已, ...

  7. iPhone的Push(推送通知)功能原理浅析

    第一部分:Push原理(以下绝大多数内容参考自.图片来自iPhone OS Reference Library)机制简介Push 的工作机制可以简单的概括为下图图中,Provider是指某个iPhon ...

  8. 关于公司内部的Nuget服务

    简介 公司内部搭建的Nuget服务,私有安全,局域网,速度快. 使用方法 VS -> 工具 -> 库程序包管理器 -> 程序包管理器设置 -> 程序包源 -> 新增以下配 ...

  9. 设计模式之美:Type Object(类型对象)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Type Object 的经典介绍. 实现方式(二):Type Object 在游戏设计中的使用. 意图 允许在运行时动态灵活的 ...

  10. 作业三:PSP记录耗时情况

    PSP2.1 Personal Software Process Stage Time planning 计划 15min Estimate 估计这个任务多久完成 130min Developing ...