1.我们备份手机联系人时,导出到SD卡时,会在SD卡中生成一个vcf文件,用于保存联系人姓名,手机号码。
vCard 规范容许公开交换个人数据交换(Personal Data Interchange PDI)信息,在传统纸质商业名片可找到这些信息。规范定义电子名片(或叫vCard)的格式。
而在Android上使用vcard就要借助第三方包:
 
 
将它复制进工程,然后Add jar即可,实现代码很简单,如下:
[html]
  if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) //判断存储卡是否存在
      {
         OutputStreamWriter writer; 
         File file = new File(Environment.getExternalStorageDirectory(),"example.vcf");
//得到存储卡的根路径,将example.vcf写入到根目录下
     try {  
         writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
           
            //create a contact   
                VCardComposer composer = new VCardComposer();  
                ContactStruct contact1 = new ContactStruct(); 
            contact1.name ="John" ;  
            contact1.company = "The Company"; 
            contact1.addPhone(Contacts.Phones.TYPE_MOBILE, "15651865008", null, true); 
            //create vCard representation   
            String vcardString;  
             vcardString = composer.createVCard(contact1, VCardComposer.VERSION_VCARD30_INT);  
                    //write vCard to the output stream   
                    writer.write(vcardString); 
            
           // writer.write("/n"); //add empty lines between contacts   
        // repeat for other contacts   
            // ...   
            writer.close();  
            Toast.makeText(c, "已成功导入SD卡中!", Toast.LENGTH_SHORT).show();
     } catch (UnsupportedEncodingException e) {  
     // TODO Auto-generated catch block   
     e.printStackTrace();  
     } catch (FileNotFoundException e) {  
     // TODO Auto-generated catch block   
     e.printStackTrace();  
     } catch (VCardException e) {  
     // TODO Auto-generated catch block   
     e.printStackTrace();  
     } catch (IOException e) {  
     // TODO Auto-generated catch block   
     e.printStackTrace();  
     }  
 
}
      else{
          Toast.makeText(c, "写入失败,SD卡不存在!", Toast.LENGTH_SHORT).show();
      }
 
 
由于要对存储卡做读写操作,所以要加读写权限:
[html]
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
 
这样联系人就备份成功了,用系统自带的联系人软件就可以实现导入。这种方式可以自己写的数据导出。

2.导出手机上的数据

ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null);
String lookupKey = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);
AssetFileDescriptor fd = this.getContentResolver().openAssetFileDescriptor(uri, "r");
FileInputStream fis = fd.createInputStream();

这种方式只能导出name和电话号码。

3.vcard文件格式

vCard
vCard 规范容许公开交换个人数据交换 (Personal Data Interchange PDI) 信息,在传统纸质商业名片可找到这些信息。规范定义电子名片(或叫vCard)的格式。
vCard 规范可作为各种应用或系统之间的交换格式。定义的格式与传送的方法无关。传送交换可能是文件系统,点对点交换的公共电话网络,以有线网络或无线传送的方式。用户能在互联网上直接利用vCard。电子邮件能转发在vCard中人信息。网页上很多用户填写的表格可自动使用vCard。
互联网邮件协会(Internet Mail C*****ortium)正在与互联网工程队伍(Internet Engineering Task Force IETF)共同努力,扩充以多用途互联网邮件为基础(Internet MIME-based)的互联网电子邮件标准标准,使之兼容vCard。vCard规范的XML绑定生成了DTD [vCard ,98] 有助于开发IMS LIP。

VCard 2.1(rfc-2426)标准通信薄基本格式
VCard 数据格式的标识符是VCARD

          预定义的值类型:uri, date, date-time, float
          新增加的值类型:binary, phone-number, utc-offset and vcard value
          预定义的类型:SOURCE, NAME, PROFILE, BEGIN, END.
          新增加的类型:FN, N, NICKNAME, PHOTO, BDAY, ADR, LABEL, TEL, EMAIL,
MAILER, TZ, GEO, TITLE, ROLE, LOGO, AGENT, ORG, CATEGORIES, NOTE,
PRODID, REV, SORT-STRING, SOUND, URL, UID, VERSION, CLASS, KEY
          预定义的参数:ENCODING, VALUE, CHARSET, LANGUAGE, CONTEXT.
          新增加的参数:TYPE

vCard数据格式行是:  类型 [;参数]:值
     ADR;HOME;POSTAL;PARCEL:;;街道地址;深圳;广东;433330;中国
ADR:是一个类型,表示是一条地址信息
       “;”号是分隔符合
       HOME;POSTAL;PARCEL表示参数,表示ADR的用途或者是类别
       :;;街道地址;深圳;广东;433330;中国 表示是一个ADR值,地址值

预定义类型的用法
BEGIN 和 END 类型

    Vcard内容必须以BEGIN:VCARD开头,以END:VCARD结尾
    参考一个vcard的例子1:
BEGIN:VCARD
VERSION:2.1
N:姓;名
FN:姓名NICKNAME:nickName
ORG:公司;部门
TITLE:职位
NOTE;ENCODING=QUOTED-PRINTABLE:=C6=E4=CB=FB
TEL;WORK;VOICE:电话1
TEL;WORK;VOICE:电话2
TEL;HOME;VOICE:电话1
TEL;HOME;VOICE:电话2
TEL;CELL;VOICE:13590342862
TEL;PAGER;VOICE:0755
TEL;WORK;FAX:传真
TEL;HOME;FAX:传真
ADR;WORK:;;单位地址;深圳;广东;433000;国家
LABEL;WORK;ENCODING=QUOTED-PRINTABLE:=B5=A5=CE=BB=B5=D8=D6=B7
=C9=EE=DB=DA
=B9=E3=B6=AB
433000
=B9=FA=BC=D2
ADR;HOME;POSTAL;PARCEL:;;街道地址;深圳;广东;433330;中国
LABEL;HOME;ENCODING=QUOTED-PRINTABLE:=BD=D6=B5=C0=B5=D8=D6=B7
=C9=EE=DB=DA
=B9=E3=B6=AB
433330
=D6=D0=B9=FA
URL:网址
URL:单位主页
EMAIL;PREF;INTERNET:邮箱地址
X-QQ:38394246
X-ICQ:icq
X-WAB-GENDER:2
REV:20060220T180305Z
END:VCARD

NAME 类型
如果在内容中出现NAME类型,那么它的值是一个可以显示的,描述vCard源的文本

PROFILE类型
    如果出现PROFILE类型,那么它的值必须是“VCARD”

SOURCE 类型
   如果包含SOURCE类型,它的值提供一些怎样找到vCard源的信息
预定参数的用法
LANGUAGE
参考[MIME-DIR]文档
ENCODING
参考[MIME-DIR]文档
VALUE
参考[MIME-DIR]文档
预定义值类型的用法
    在[MIME-DIR]中预定类型的值一定不能包含用逗号分开的列表,除N,NICKNAME, ADR和 CATEGORIES值类型外。

预定义值类型的扩展
BINARY
表明类型的值是二进制的,主要应用在类型PHOTO, LOGO, SOUND, and KEY中.
ENCODING参数的值必须指定为“B”
         二进制的内容的编码参考[RFC 2047]
VCARD
表示一个类型的值是一个vCard对象
PHONE-NUMBER
    表示类型的值是一个电话号码
UTC-OFFSET
    表示时间
结构类型的值
    复合类型值是用分号分开的字段的集合,复合类型值中避免使用分号,如何需要使用分号,需要用“/分号“替代
行的限定和分行
参考[MIME DIR],如果行的长度超过了75个字符,那么必须分行。

VCard 特征
标识类型
FN 类型定义
   目的:vcard对象的名称,一个vcard对象必须包含FN类型。
   例子:FN:Mr. John Q. Public/, Esq.

N类型定义
目的:FN表示一个vcard对象的名称,N表示这个对象名称的组成部分
   例子:N:Public;John;Quinlan;Mr.;Esq.
         N:Stevenson;John;Philip,Paul;Dr.;Jr.,M.D.,A.C.P.
   各个组成部分可以用分号分号,每个组成部分可以用逗号。

NICKNAME类型定义
目的:表示别名
例子:NICKNAME:Robbie
         NICKNAME:Jim,Jimmie

PHOTO类型定义
目的:vcard对象的图像信息
例子:PHOTO;VALUE=uri:图片地址
PHOTO;ENCODING=b;TYPE=JPEG:MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcN
          AQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bm
          ljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0
          <...remainder of "B" encoded binary data...>
    如果使用内联的二进制数据表示图片信息,那么;ENCODING=b

BDAY类型定义
目的:表示出生日期
例子:BDAY:1996-04-15
         BDAY:1953-10-15T23:10:00Z
         BDAY:1987-09-27T08:30:00-06:00

地址类型
ADR 类型定义

目的:是一个组合,用来表示一个地址信息,值类型是一个用分号分开的文本值
例子:ADR;TYPE=dom,home,postal,parcel:;;123 Main Street;Any Town;CA;91921-1234;A
ADR;HOME;POSTAL;PARCEL:;;街道地址;深圳;广东;444444;中国
         组合由一下部分顺序的组成:
the post office box;
the extended address;
the street address;
the locality (e.g., city);
the region (e.g., state or  province);
the postal code;
the country name
七个部分组成,如果,其他的一个部分没有,必须用分号分开
type 参数的说明
"dom"  国内地址
"intl" 国际地址
"parcel"包裹递送地址
"home" 居住地址;
"work"工作地址;
"pref" 有多个地址的时候,优先的地址
缺省的"TYPE=intl,postal,parcel,work",可以替换

LABEL类型定义
目的:是一格式化的文本值,表示一个地址
例子:LABEL;TYPE=dom,home,postal,parcel:Mr.John Q. Public/, Esq./n
          Mail Drop: TNE QB/n123 Main Street/nAny Town/, CA  91921-1234
          /nU.S.A.    
type 参数的说明
"dom"  国内地址
"intl" 国际地址
"parcel"包裹递送地址
"home" 居住地址;
"work"工作地址;
"pref" 有多个地址的时候,优先的地址
缺省的"TYPE=intl,postal,parcel,work",可以替换
和ADR的不同是 ADR的值是用分号分开的数据,LABEL就是一个格式化的文本。

电话通信地址类型
TEL类型定义
目的:指定一个电话号码
例子:TEL;TYPE=work,voice,pref,msg:+1-213-555-1234
说明:值是一个规范的全球唯一的电话号码
      TYPE参数的值有:
             "home"表示家庭电话
         "msg" 表示这个号码支持语音
"work" 工作电话
"pref" 表示多个电话中最喜欢使用的电话
"voice" 声音电话号码
                "fax"传真号码
         "cell" 表示手机电话
"video" 视频电话
"pager" 调度电话,估计是总机的电话
         "bbs" 公开的广播系统的电话
         "modem" 调制解调器电话
         "car"汽车电话
         "isdn" ISDN连接电话号码
"pcs" 个人通信服务电话
缺省是 "voice".
TYPE参数的用法是TYPE=work;TYPE=voice或者"TYPE=work,voice",缺省值可以被重置
"TYPE=work,home,voice,fax".

EMAIL类型定义
目的:指定一个电子邮件
例子:EMAIL;TYPE=internet:邮箱地址
     EMAIL;TYPE=x400:邮箱地址
     EMAIL;TYPE=internet,pref:邮箱地址
TYPE参数的使用
"internet" 表示一个internet 类型地址
     "x400" 表示是一个 X.400 地址
    "pref"最喜欢使用的邮件电子
缺省是"internet".
MAILER 类型定义
目的:指定一个电子邮件发送者
例子:MAILER:PigeonMail 2.1

地理类型
TZ类型定义
目的:时区信息
例子:TZ:-05:00
         TZ;VALUE=text:-05:00; EST; Raleigh/North America
         缺省是一个utc-offset值.
GEO类型定义
目的:地理位置信息
例子GEO:37.386013;-122.082932
      CEO 经度;纬度

组织类型
TITLE类型定义
目的:工作位置,工作职能(job title)
例子TITLE:Director/, Research and Development

ROLE 类型定义
目的:公司的职业(occupation)
例子ROLE:Programmer

LOGO类型定义
目的:公司logo,是一个图像信息
例子LOGO;VALUE=uri:图片地址
LOGO;ENCODING=b;TYPE=JPEG:MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcN         AQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bm
          ljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0
          <...the remainder of "B" encoded binary data...>
说明:TYPE知道图像的格式,ENCODING=b表示是二进制的数据流
       URI表示是一个外部图像对象

AGENT类型定义
目的:指定另外一个人替换他的个人行为
例子:AGENT;VALUE=uri: CID:JQPUBLIC.part3.960129T083020.邮箱地址
          AGENT:BEGIN:VCARD/nFN:Susan Thomas/nTEL:+1-919-555-
          1234/nEMAIL/;INTERNET:主机地址/nEND:VCARD/n
说明:缺省是一个Vcard对象,当时也可是一个URI指定的外部Vcard对象

ORG类型定义
目的:表示一个组织的名称
例子ORG:ABC/, Inc.;North American Division;Marketing

解释类型
CATEGORIES类型定义
目的:vcard应用的分类信息
例子:CATEGORIES:TRAVEL AGENT
       CATEGORIES:INTERNET,IETF,INDUSTRY,INFORMATION TECHNOLOGY

NOTE 类型定义
目的:对vcard的注释和说明
例子:NOTE:This fax number is operational 0800 to 1715
           EST/, Mon-Fri.

PRODID类型定义
目的:指定创建Vcard对象的产品的ID
例子:PRODID:-//ONLINE DIRECTORY//N*****GML Version 1//EN

REV类型定义
目的:指定当前Vcard的修改信息
例子:REV:1995-10-31T22:27:10Z
       REV:1997-11-15

SORT-STRING类型定义
目的:指定家庭名称或者其他名称对FN和N类型排序
例子:  FN:Rene van der Harten
         N:van der Harten;Rene;J.;Sir;R.D.O.N.
         SORT-STRING:Harten
         FN:Robert Pau Shou Chang
         N:Pau;Shou Chang;Robert
         SORT-STRING:Pau
         FN:Osamu Koura
         N:Koura;Osamu
         SORT-STRING:Koura
         FN:Oscar del Pozo
         N:del Pozo Triscon;Oscar
         SORT-STRING:Pozo
         FN:Chistine d'Aboville
         N:d'Aboville;Christine
         SORT-STRING:Aboville

SOUND类型定义
目的:指定Vcard的数字声音信息,缺省是指定vcard的name类型的发音信息。
例子:  SOUND;TYPE=BASIC;VALUE=uri:CID:JOHNQPUBLIC.part8.
          19960229T080000.地址
         SOUND;TYPE=BASIC;ENCODING=b:MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcN         AQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bm         ljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0  <...the remainder of "B" encoded binary data...>
可以用URI指定一个外部声音二进制流
     可以是内置的声音二进制流,ENCODING=b

UID类型定义
目的:指定一个全球唯一的个人或资源标识。
例子:UID:19950401-080045-40000F192713-0052

URL类型定义
目的:指定Vcard 参考的路径。
例子:URL: 网址

VERSION类型定义
目的:指定Vcard使用的vcard规范的版本。
例子:  VERSION:3.0

Security 类型
CLASS类型定义
目的:指定访问Vcard对象的访问分级。
例子:  CLASS:PUBLIC
         CLASS:PRIVATE
         CLASS:CONFIDENTIAL
说明:安全分级需要参考目录服务的访问分级

KEY 类型定义
目的:指定Vcard的公共钥匙值(加密解密是使用)或者是授权认证。
例子:  KEY;ENCODING=b:MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcNAQEEBQA
          wdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENbW11bmljYX
          Rpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0
          ZW1zMRwwGgYDVQQDExNyb290Y2EubmV0c2NhcGUuY29tMB4XDTk3MDYwNj
          E5NDc1OVoXDTk3MTIwMzE5NDc1OVowgYkxCzAJBgNVBAYTAlVTMSYwJAYD
          VQQKEx1OZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3JwLjEYMBYGA1UEAx
          MPVGltb3RoeSBBIEhvd2VzMSEwHwYJKoZIhvcNAQkBFhJob3dlc0BuZXRz
          Y2FwZS5jb20xFTATBgoJkiaJk/IsZAEBEwVob3dlczBcMA0GCSqGSIb3DQ
          EBAQUAA0sAMEgCQQC0JZf6wkg8pLMXHHCUvMfL5H6zjSk4vTTXZpYyrdN2
          dXcoX49LKiOmgeJSzoiFKHtLOIboyludF90CgqcxtwKnAgMBAAGjNjA0MB
          EGCWCGSAGG+EIBAQQEAwIAoDAfBgNVHSMEGDAWgBT84FToB/GV3jr3mcau
          +hUMbsQukjANBgkqhkiG9w0BAQQFAAOBgQBexv7o7mi3PLXadkmNP9LcIP
          mx93HGp0Kgyx1jIVMyNgsemeAwBM+MSlhMfcpbTrONwNjZYW8vJDSoi//y
          rZlVt9bJbs7MNYZVsyF1unsqaln4/vy6Uawfg8VUMk1U7jt8LYpo4YULU7
          UZHPYVUaSgVttImOHZIKi4hlPXBOhcUQ==

扩展类型
     可以定义自己的类型,自己定义的类型需要以“x-”开头
比喻例子中的信息:
X-QQ:000000
X-ICQ:icq
X-WAB-GENDER:2

4,vcard自定义选项导出,如我在Contacts的data表中存了新浪微博,腾讯微博和人人网的账号,我想在导出vcard时也将3种账号存起来,实现方法:

Android Vcard使用心得相关推荐

  1. Android studio 使用心得(三)—从Eclipse迁移到Android studio

    断断续续的也算是把eclipse上的代码成功迁移到android studio上来了,现在,我同事继续用eclipse,我用android studio,svn上还是之前eclipse的项目,迁移成功 ...

  2. Android studio 使用心得(六)---android studio 如何加载.so文件

    2019独角兽企业重金招聘Python工程师标准>>> 之前一直没怎么注意,以为.so文件android为像eclipse一样直接加载,但是直到昨天我在android studio上 ...

  3. Android studio使用心得(二)— 打包签名apk发布

    1.-–Android Studio菜单   Build->Generate Signed APK 2.--Create new.. 3.---跟eclipse里面一样,添加keystore 信 ...

  4. (转)Android studio 使用心得(五)—代码混淆和破解apk

    这篇文章等是跟大家分享一在Android studio 进行代码混淆配置.之前大家在eclipse上也弄过代码混淆配置,其实一样,大家可以把之前在eclipse上的配置文件直接拿过来用.不管是.cfg ...

  5. android培训总结范文,android开发培训心得总结

    1/2ANDROID开发培训心得总结ANDROID开发培训心得总结在我大学毕业后的大段时光里,曾经有过四个月的时间,这四个月里有很多辛苦的瞬间,亦有欢笑,都很充实,我学到了很多ANDROID开发方面的 ...

  6. Android VCard联系人备份恢复(导入/导出)详解

    原文地址为: Android VCard联系人备份恢复(导入/导出)详解 首先我们简单的看下在Android中联系人的存储结构. 工作环境:android 2.3.3 联系人的主要数据存放在raw_c ...

  7. android vcard解析代码,Android使用vcard文件的方法简单实例

    本文实例讲述了Android使用vcard文件的方法.分享给大家供大家参考,具体如下: FileOutputStream os = null; try { os = VCardTest.this.op ...

  8. 一篇非大厂的 Android 面试总结心得~

    作者:小志 概述 由于本文较长,为了不浪费大家的时间,我先对全文内容做一个简单的内容介绍,以便大家了解是否适合自己.本文主要是我最近面试的总结心得与规划.包含:**面试准备,简历建议,投递简历方法,面 ...

  9. 记录第一次开发android的学习心得

    文章目录 前言 一.自定义View 1.编写自定义view的样式 2.在activity对应的页面引用 3.编写自定义view java文件 二.mvp框架 1.contract 2.activity ...

最新文章

  1. RLCenter云平台配置中心
  2. Mysql-study
  3. mysql 源代码学习 博客 [lock..]
  4. java中map可以为空吗_Java: Map里面的键和值可以为空吗?
  5. 划重点!通俗解释协方差与相关系数
  6. background-size
  7. 秒杀奥斯卡的“第四块广告牌”就在你身边!
  8. Python数据可视化2.3 体育案例
  9. hbase权威指南-客户端API高级特性
  10. 2013中国电商盘点回顾
  11. 新手接触使用Hashcat 破解Office加密文档
  12. Java多线程入门一
  13. win10计算机管理找不到用户,win10重装系统后管理账户不见了,win10怎么找到管理账户?...
  14. 微信支付申请相关问题
  15. vue 表情包编码转换
  16. Julia 数据科学应用
  17. 感恩工作平台心得体会_感恩工作心得体会
  18. iOS项目集成unity(2020+ 版本)
  19. 宝马将自动驾驶和打车服务结合,最快明年在德国上路
  20. 找不到全局编录服务器,将 DC 提升至全局编录服务器时出现问题 - Windows Server | Microsoft Docs...

热门文章

  1. 百度云api调用时出现“Max retries exceeded with url”的解决
  2. 算法-程序设计课week2---C:POJ - 1786
  3. 五月&六月券商金工精选
  4. AppStore 审核出现“账号调查”的原因分析
  5. MODIS数据知识积累
  6. 后端如何过滤敏感字段传参给前端
  7. 2个小投资不起眼的冷门小生意
  8. 利用Python给女朋友跨年放个烟花
  9. 在代码中,给java程序自身设置网络代理来爬虫相关站点或使用相关api。
  10. 在线免费图片格式转化各类型都适用