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 の「連絡先」アプリで作成した新規連絡先。

iPhone 4S + iOS 5.0.1 「連絡先」アプリ

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)