热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android导入vCard联系人流程

本博客基于android7.1版本分析,仅用于沟通学习使用上一篇博客介绍了android导出vCard联系人流程紧接着我们在这篇博客来看看它是如何导入一个vCard

本博客基于android7.1版本分析,仅用于沟通学习使用

上一篇博客介绍了 android导出vCard联系人流程 紧接着我们在这篇博客来看看它是如何导入一个vCard联系人的。


整体流程总结


  1. 通过在contacts联系人中界面跳转,我们跳转到了 DocumentsActivity 界面并选择我们需要导入的以 .vcf 结尾的vCard文件,将Uri以intent的方式返回给ImportVCardActivity。
  2. 通过readUriToLocalUri方法将uri指向的文件copy到本地临时目录。
  3. 启动一个线程开始解析文件,并指定vCard类型为 text/x-vcard 版本为2.1,后面就只会创建2.1版本对应的解析器,所以其它版本的vCard导入可能会出现问题。
  4. 然后通过VCardParserImpl_V21来具体解析文件中的每一行,最后通过VCardEntryCommitter.pushIntoContentResolver批量插入contacts的数据库

几个重点类的作用


  • ImportVCardActivity : 一个中间控制类,它控制了界面dialog、notification、service、thread的启动和消失
  • VCardParserImpl_V21 : 负责vCard2.1版本内容的逐行解析
  • VCardEntryConstructor : 负责将解析出来的数据以VCardEntry的形式暂存在内存中
  • VCardEntryCommitter : 负责将解析出来的数据存储到contacts数据库中

整体操作图

这里写图片描述


整体流程图

这里写图片描述


部分重点方法介绍


VCardParserImpl_V21

/*** * vcard = "BEGIN" [ws] ":" [ws] "VCARD" [ws] 1*CRLF* items *CRLF* "END" [ws] ":" [ws] "VCARD"* * @return False when reaching end of file.*/private boolean parseOneVCard() throws IOException, VCardException {// reset for this entire vCard.mCurrentEncoding = DEFAULT_ENCODING; //8BITmCurrentCharset = DEFAULT_CHARSET; //UTF-8boolean allowGarbage = false;if (!readBeginVCard(allowGarbage)) {return false;}for (VCardInterpreter interpreter : mInterpreterList) {interpreter.onEntryStarted(); //解析vCard中一个联系人开始标志}parseItems();//逐行解析for (VCardInterpreter interpreter : mInterpreterList) {interpreter.onEntryEnded(); //解析完vCard中一个联系人结束标志}return true;}

protected boolean readBeginVCard(boolean allowGarbage) throws IOException, VCardException {// TODO: use consructPropertyLine().String line;do {while (true) {line = getLine();if (line == null) {return false;} else if (line.trim().length() > 0) {break;}}final String[] strArray = line.split(":", 2);final int length = strArray.length;// Although vCard 2.1/3.0 specification does not allow lower cases,// we found vCard file emitted by some external vCard expoter have such// invalid Strings.// e.g. BEGIN:vCardif (length == 2 && strArray[0].trim().equalsIgnoreCase("BEGIN")&& strArray[1].trim().equalsIgnoreCase("VCARD")) { //判断是否是开头?return true;} else if (!allowGarbage) {throw new VCardException("Expected String \"BEGIN:VCARD\" did not come "+ "(Instead, \"" + line + "\" came)");}} while (allowGarbage);throw new VCardException("Reached where must not be reached.");}

/** item = [groups "."] name [params] ":" value CRLF / [groups "."] "ADR"* [params] ":" addressparts CRLF / [groups "."] "ORG" [params] ":" orgparts* CRLF / [groups "."] "N" [params] ":" nameparts CRLF / [groups "."]* "AGENT" [params] ":" vcard CRLF*/protected boolean parseItem() throws IOException, VCardException {// Reset for an item.mCurrentEncoding = DEFAULT_ENCODING;final String line = getNonEmptyLine();final VCardProperty propertyData = constructPropertyData(line);final String propertyNameUpper = propertyData.getName().toUpperCase();final String propertyRawValue = propertyData.getRawValue();if (propertyNameUpper.equals(VCardConstants.PROPERTY_BEGIN)) {if (propertyRawValue.equalsIgnoreCase("VCARD")) {handleNest();} else {throw new VCardException("Unknown BEGIN type: " + propertyRawValue);}} else if (propertyNameUpper.equals(VCardConstants.PROPERTY_END)) {if (propertyRawValue.equalsIgnoreCase("VCARD")) {return true; // Ended.} else {throw new VCardException("Unknown END type: " + propertyRawValue);}} else {parseItemInter(propertyData, propertyNameUpper);}return false;}

private void parseItemInter(VCardProperty property, String propertyNameUpper)throws IOException, VCardException {String propertyRawValue = property.getRawValue();if (propertyNameUpper.equals(VCardConstants.PROPERTY_AGENT)) {handleAgent(property);} else if (isValidPropertyName(propertyNameUpper)) {if (propertyNameUpper.equals(VCardConstants.PROPERTY_VERSION) &&!propertyRawValue.equals(getVersionString())) {throw new VCardVersionException("Incompatible version: " + propertyRawValue + " != " + getVersionString());}handlePropertyValue(property, propertyNameUpper); //解析里面每个属性} else {throw new VCardException("Unknown property name: \"" + propertyNameUpper + "\"");}}

推荐阅读
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • 本文详细介绍超文本标记语言(HTML)的基本概念与语法结构。HTML是构建网页的核心语言,通过标记标签描述页面内容,帮助开发者创建结构化、语义化的Web页面。 ... [详细]
  • 算法题解析:最短无序连续子数组
    本题探讨如何通过单调栈的方法,找到一个数组中最短的需要排序的连续子数组。通过正向和反向遍历,分别使用单调递增栈和单调递减栈来确定边界索引,从而定位出最小的无序子数组。 ... [详细]
  • 本文探讨了使用C#在SQL Server和Access数据库中批量插入多条数据的性能差异。通过具体代码示例,详细分析了两种数据库的执行效率,并提供了优化建议。 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • 本文介绍如何使用 Android 的 Canvas 和 View 组件创建一个简单的绘图板应用程序,支持触摸绘画和保存图片功能。 ... [详细]
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • 在项目部署后,Node.js 进程可能会遇到不可预见的错误并崩溃。为了及时通知开发人员进行问题排查,我们可以利用 nodemailer 插件来发送邮件提醒。本文将详细介绍如何配置和使用 nodemailer 实现这一功能。 ... [详细]
  • 本文详细探讨了JavaScript中的作用域链和闭包机制,解释了它们的工作原理及其在实际编程中的应用。通过具体的代码示例,帮助读者更好地理解和掌握这些概念。 ... [详细]
  • C#设计模式学习笔记:观察者模式解析
    本文将探讨观察者模式的基本概念、应用场景及其在C#中的实现方法。通过借鉴《Head First Design Patterns》和维基百科等资源,详细介绍该模式的工作原理,并提供具体代码示例。 ... [详细]
  • 本文介绍如何使用 Angular 6 的 HttpClient 模块来获取 HTTP 响应头,包括代码示例和常见问题的解决方案。 ... [详细]
  • 利用Selenium与ChromeDriver实现豆瓣网页全屏截图
    本文介绍了一种使用Selenium和ChromeDriver结合Python代码,轻松实现对豆瓣网站进行完整页面截图的方法。该方法不仅简单易行,而且解决了新版Selenium不再支持PhantomJS的问题。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本文介绍如何使用MFC和ADO技术调用SQL Server中的存储过程,以查询指定小区在特定时间段内的通话统计数据。通过用户界面选择小区ID、开始时间和结束时间,系统将计算并展示小时级的通话量、拥塞率及半速率通话比例。 ... [详细]
  • Redux入门指南
    本文介绍Redux的基本概念和工作原理,帮助初学者理解如何使用Redux管理应用程序的状态。Redux是一个用于JavaScript应用的状态管理库,特别适用于React项目。 ... [详细]
author-avatar
右心1477
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有