Android 联系人导入导出(VCard格式)

之前在Android Contact 导入导出 vcf格式(不依赖第三方库)记录了一下依赖Android sdk中的功能导入导出联系人(第一次做java项目内容,有些地方的记录是否正确,暂时我也不知道。。。),最终发现像联系人分组之类的无法导出,所以就想还是自己去写VCard文件

权当笔记记录,我把我的工作顺序也记录一下

第一步是查资料,肯定是去官网(作为猿猴,必须自备梯子):

联系人提供程序,这里有整体的介绍,我挨着看完的,看完这个也就有了整体的了解

比如联系人的主要表结构,联系人、原始联系人的概念,联系人数据的查询等,文章还有相关的代码片段

第二步是找查VCard的相关资料,首先是百度百科了解了大概,知道他是一个规范,他的结构和组织形式

最后去找了个第三方库ez-vcard,这个是专门处理vCard的,个人感觉很好用,跟着他提供的例子走一波,发现就已经满足了我个人的需求

比如电话邮件什么的直接提供了操作接口,也提供了接口操作vCard扩展类型

第三步就是写测试代码,根据一、二步写了代码,尝试备份姓名、电话、邮件三种数据,然后尝试了还原,当然写的过程中都在查api文档(Android sdk文档我是下载到本地的,所以直接在Android studio中可以查看,没下载我也不知道能不能。。。。)

ContactsContract.CommonDataKinds类定义了常规的联系人信息,比如电话、邮件等

比如电话号码:ContactsContract.CommonDataKinds.Phone

去看这个类文档,类别名(Column aliases)节点中描述了相关列的定义

第四步就是做Demo,先做联系人备份,想了一下代码结构,因为ContactsContract.CommonDataKinds中的数据需求并未完全覆盖,所以我想把ContactsContract.CommonDataKinds中定义的各种数据放在各自的类中来处理,于是我就定义了一个ContactVCardFillerAbstract的抽象类,提供一个fill接口,fill接口由子类实现,然后为了方便挂载、卸载Filler,我把Filler以链表的形式组织起来(有点像职责链)。在子类实现的过程中,所有的定义我是以Android的定义为准,如果ez-vcard不直接支持,就直接自定义类型,比如ContactsContract.CommonDataKinds.Im这种数据,可以这样子自定义(根据规范,自定义必须以X-开头)

第一种:

X-IM;TYPE=QQ:12345677

X-IM;TYPE=ICQ:96321587

第二种:

X-IM-QQ:12345677

X-IM-ICQ:96321587

第五步就是做联系人还原,和备份类似,直接定义了一个VCardContactFillerAbstract,然后依次实现各个子类,写完之后发现备份和还原的抽象类可以再次抽象成同一个,于是就写成了ContentFillerAbstract

第六步就是再次查看代码然后再改,发现因为Data表是一张纵表,同时也为了方便列扩充,所以定义了一个DataTable结构来存储要方便很多(备份联系人主要就是操作data表),

然后又定义了一个ContactVCardLabelMapping来做VCard类型和Contact数据的映射(起名成ContactVCardContacts感觉要比Mapping要好)

基本就做了这么多,此Demo就完成了

Demo 代码(AndroidContactsBackUpRestoreVCardDemo 

此Demo包含以下数据备份还原
联系人姓名
联系人头像
联系人的电话
联系人的生日和周年纪念
备注信息
分组信息
联系人的地址信息
联系人的Email
联系人的Company和Title信息
联系人的Website;
联系人使用的即时聊天(IM)

posted on 2018-01-25 13:31  落寞情缘  阅读(1486)  评论(0编辑  收藏  举报

导航