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)