vCard ファイル (*.vcf) を読み込んで中身を出力するサンプルプログラム。
vCard を操作する Java のライブラリ、 android-vcard-1.4.7 を使う。
VcardSample.java
import java.io.*;
import java.util.*;
import a_vcard.android.syncml.pim.*;
import a_vcard.android.syncml.pim.vcard.*;
public class VcardSample {
private static String readTextFile(String file) throws Exception {
BufferedReader reader = new BufferedReader(
new InputStreamReader(
new FileInputStream(file), "UTF-8"));
String vcardString = "";
String line;
while ((line = reader.readLine()) != null) {
vcardString += line + "\n";
}
reader.close();
return vcardString;
}
private static File[] getVcfFiles(String dir){
File f = new File(dir);
File[] files = f.listFiles(new FilenameFilter() {
public boolean accept(File file, String name) {
boolean ret = name.endsWith(".vcf");
return ret;
}
});
return files;
}
public static void main(String[] args) throws Exception {
String dir = args[0];
File[] files = getVcfFiles(dir);
for (File file : files) {
String vcardString = readTextFile(file.getAbsolutePath());
VCardParser parser = new VCardParser();
VDataBuilder builder = new VDataBuilder();
if (!parser.parse(vcardString, "UTF-8", builder)) {
throw new VCardException(
"Could not parse vCard file: " + file.getAbsolutePath());
}
List<VNode> pimContacts = builder.vNodeList;
for (VNode contact : pimContacts) {
System.out.println("VName: " + contact.VName);
System.out.println("parseStatus: " +
((contact.parseStatus == 1) ? "parsing" : "parse over"));
ArrayList<PropertyNode> props = contact.propList;
for (PropertyNode prop : props) {
System.out.println(prop.propName + " : " + prop.propValue);
System.out.println(prop.propName + " : " + prop.toString());
}
}
}
}
}
読み込ませるのは iPhone 4S + iOS 5.0.1 の「連絡先」アプリで作成した新規連絡先。
「連絡先」アプリの「連絡先を送信」機能で vcf ファイルをメールで送る。
これが、今回読み込ませる vCard (NickLabadie.vcf) ファイルの中身。
$ cat ./NickLabadie.vcf
BEGIN:VCARD
VERSION:3.0
PRODID:-//Apple Inc.//iOS 5.0.1//EN
N:Labadie;Nick;;;
FN:Nick Labadie
X-PHONETIC-FIRST-NAME:にっく
X-PHONETIC-LAST-NAME:らばでぃ
ORG:えぬあいらぼ;
EMAIL;type=INTERNET;type=HOME;type=pref:nilabinfo@gmail.com
item1.EMAIL;type=INTERNET:nilabinfo@nilab.info
item1.X-ABLabel:携帯電話
TEL;type=HOME;type=VOICE:0123 45 6789
TEL;type=CELL;type=VOICE:123 45 6789
item2.ADR;type=HOME;type=pref:;;三の丸三丁目1番2号;名古屋市中区;愛知県;460-8501;日本
item2.X-ABADR:ja
item3.URL;type=pref:http://www.nilab.info/
item3.X-ABLabel:_$!<HomePage>!$_
BDAY;value=date:2011-11-11
X-SOCIALPROFILE;type=twitter;x-user=nilab:http://twitter.com/nilab
X-SOCIALPROFILE;type=facebook;x-user=nilabinfo:http://www.facebook.com/nilabinfo
END:VCARD
サンプルプログラムの実行結果。
$ ls
NickLabadie.vcf android-vcard.jar
VcardSample.java commons-codec-1.4.jar
$ javac -encoding UTF-8 -classpath android-vcard.jar:commons-codec-1.4.jar ./VcardSample.java
$ java -Dfile.encoding=UTF-8 -classpath .:android-vcard.jar:commons-codec-1.4.jar VcardSample ./
VName: VCARD
parseStatus: parse over
VERSION : 3.0
VERSION : propName: VERSION, paramMap: , propmMap_TYPE: [], propGroupSet: [], propValue: 3.0
PRODID : -//Apple Inc.//iOS 5.0.1//EN
PRODID : propName: PRODID, paramMap: , propmMap_TYPE: [], propGroupSet: [], propValue: -//Apple Inc.//iOS 5.0.1//EN
N : Labadie;Nick;;;
N : propName: N, paramMap: , propmMap_TYPE: [], propGroupSet: [], propValue_vector size: 5, propValue: Labadie;Nick;;;
FN : Nick Labadie
FN : propName: FN, paramMap: , propmMap_TYPE: [], propGroupSet: [], propValue: Nick Labadie
X-PHONETIC-FIRST-NAME : にっく
X-PHONETIC-FIRST-NAME : propName: X-PHONETIC-FIRST-NAME, paramMap: , propmMap_TYPE: [], propGroupSet: [], propValue: にっく
X-PHONETIC-LAST-NAME : らばでぃ
X-PHONETIC-LAST-NAME : propName: X-PHONETIC-LAST-NAME, paramMap: , propmMap_TYPE: [], propGroupSet: [], propValue: らばでぃ
ORG : えぬあいらぼ;
ORG : propName: ORG, paramMap: , propmMap_TYPE: [], propGroupSet: [], propValue_vector size: 2, propValue: えぬあいらぼ;
EMAIL : nilabinfo@gmail.com
EMAIL : propName: EMAIL, paramMap: , propmMap_TYPE: [INTERNET, HOME, pref], propGroupSet: [], propValue: nilabinfo@gmail.com
EMAIL : nilabinfo@nilab.info
EMAIL : propName: EMAIL, paramMap: , propmMap_TYPE: [INTERNET], propGroupSet: [item1], propValue: nilabinfo@nilab.info
X-ABLabel : 携帯電話
X-ABLabel : propName: X-ABLabel, paramMap: , propmMap_TYPE: [], propGroupSet: [item1], propValue: 携帯電話
TEL : 0123 45 6789
TEL : propName: TEL, paramMap: , propmMap_TYPE: [HOME, VOICE], propGroupSet: [], propValue: 0123 45 6789
TEL : 123 45 6789
TEL : propName: TEL, paramMap: , propmMap_TYPE: [CELL, VOICE], propGroupSet: [], propValue: 123 45 6789
ADR : ;;三の丸三丁目1番2号;名古屋市中区;愛知県;460-8501;日本
ADR : propName: ADR, paramMap: , propmMap_TYPE: [HOME, pref], propGroupSet: [item2], propValue_vector size: 7, propValue: ;;三の丸三丁目1番2号;名古屋市中区;愛知県;460-8501;日本
X-ABADR : ja
X-ABADR : propName: X-ABADR, paramMap: , propmMap_TYPE: [], propGroupSet: [item2], propValue: ja
URL : http://www.nilab.info/
URL : propName: URL, paramMap: , propmMap_TYPE: [pref], propGroupSet: [item3], propValue: http://www.nilab.info/
X-ABLabel : _$!<HomePage>!$_
X-ABLabel : propName: X-ABLabel, paramMap: , propmMap_TYPE: [], propGroupSet: [item3], propValue: _$!<HomePage>!$_
BDAY : 2011-11-11
BDAY : propName: BDAY, paramMap: value=date, propmMap_TYPE: [], propGroupSet: [], propValue: 2011-11-11
X-SOCIALPROFILE : http://twitter.com/nilab
X-SOCIALPROFILE : propName: X-SOCIALPROFILE, paramMap: x-user=nilab, propmMap_TYPE: [twitter], propGroupSet: [], propValue: http://twitter.com/nilab
X-SOCIALPROFILE : http://www.facebook.com/nilabinfo
X-SOCIALPROFILE : propName: X-SOCIALPROFILE, paramMap: x-user=nilabinfo, propmMap_TYPE: [facebook], propGroupSet: [], propValue: http://www.facebook.com/nilabinfo
ちなみに、今回の環境。
$ uname -mrsv
Darwin 11.2.0 Darwin Kernel Version 11.2.0: Tue Aug 9 20:54:00 PDT 2011; root:xnu-1699.24.8~1/RELEASE_X86_64 x86_64
$ java -version
java version "1.6.0_29"
Java(TM) SE Runtime Environment (build 1.6.0_29-b11-402-11M3527)
Java HotSpot(TM) 64-Bit Server VM (build 20.4-b02-402, mixed mode)
Ref. android-vcard - Java vCard library - Google Project Hosting
tags: vcard java
Posted by NI-Lab. (@nilab)