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

但是,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. [UCSD白板题] Points and Segments

    Problem Introduction The goal in this problem is given a set of segments on a line and a set of poin ...

  2. c#dataGridView奇偶数行变色

    dataGridView_Performance.RowsDefaultCellStyle.BackColor = Color.Bisque; dataGridView_Performance.Alt ...

  3. 8.1 消息通信 EventBus

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

  4. Android多线程

    final Handler handler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { ...

  5. C++ 非阻塞套接字的使用 (1)

    在维护代码的过程中,发现软件运行的CPU占用率居高不下,在4核的电脑上占用了25%的CPU.查阅资料的得知,这是可能是由于软件中出现了死循环. 经过对软件的一些测试,最终确定了死循环出现的位置——通讯 ...

  6. Linux内核--网络栈实现分析(三)--驱动程序层+链路层(上)

    本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7497260 更多请看专栏,地址 ...

  7. webview使用总结及注意事项

    1 网页 调用后台java代码 ,后台处理 一 网页上click事件 <a href="javascript:;" onclick="window.JsNative ...

  8. mongoDB研究笔记:复制集概述

    自我学习,仅供参考: 数据库总是会遇到各种失败的场景,如网络连接断开.断电等,尽管journaling日志功能也提供了数据恢复的功能,但journaling通常是针对单个节点来说的,只能保证单节点数据 ...

  9. Linux + Mono 目前已经支持Entity Framework 6.1

    在上个随笔 CentOS上 Mono3.2.8运行ASP.NET MVC4经验中,步骤2中要求卸载EF 5.0,这样才能在Linux + Mono的环境中运行ASP.NET MVC4的Web应用.今天 ...

  10. 可在广域网部署运行的QQ高仿版 -- GG叽叽V3.2,增加离线消息、离线文件功能(源码)

    (几句题外话:虽然就如何将GG发展为一个有商业价值的产品,我还没有很清晰明确的思路,但是从GG发布以来,通过GG认识了一些朋友,也接了一些小单子,赚了一点小钱.有了一点甜头,目前和2.3个好朋友一起做 ...