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>
這樣聯繫人就備份成功了,用系統自帶的聯繫人軟件就能夠實現導入。這種方式能夠本身寫的數據導出。html
2.導出手機上的數據java
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(); android
這種方式只能導出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:2app
4,vcard自定義選項導出,如我在Contacts的data表中存了新浪微博,騰訊微博和人人網的帳號,我想在導出vcard時也將3種帳號存起來,實現方法:composer
frameworks\opt\vcard\java\com\android\vcard\VCardComposer.javadom
修 改buildVCard(final Map<String, List<ContentValues>> contentValuesListMap,String accountType)方法;ide
在 builder後加個builder.appendSocialNetwork(contentValuesListMap.get("vnd.android.cursor.item/socialnetwork"));post
appendSocialNetwork(contentValuesListMap.get("vnd.android.cursor.item/socialnetwork")) 在
frameworks\opt\vcard\java\com\android\vcard\VCardBuilder.java 中實現便可。請參考該類中的類似方法實現。