zoukankan      html  css  js  c++  java
  • Atitit Java制作VCARD vcf 以上就是关于vCard的基本介绍,维基百科(英文)https://en.wikipedia.org/wiki/VCard写的比较全,可惜我看不懂。

    Atitit Java制作VCARD   vcf

     

     

    以上就是关于vCard的基本介绍,维基百科(英文)https://en.wikipedia.org/wiki/VCard写的比较全,可惜我看不懂。关于vCard格式介绍的文章网上也有很多,我就不再一一阐述。但是关于Java操作vCard的例子却不是很多了,有些也就是自己单单写的一个解析类,于是我漫游网络,最终找到了ez-vcard,我不知道还有没有别的库能操作vCard的,肯定有,但是我也懒得去找了,反正这个可以用就行了。╮( ̄▽ ̄)╭


    ez-vcard: 

    github主页:https://github.com/mangstadt/ez-vcard

     

    下载地址:https://github.com/mangstadt/ez-vcard/wiki/Downloads

     

    API文档:http://mangstadt.github.io/ez-vcard/javadocs/latest/index.html

     

    参考资料:https://github.com/mangstadt/ez-vcard/wiki

     

     

    然后开始编写createVCard(Properties);

     

    首先new一个VCard实体类


    VCard vcard = new VCard(); 

    以Email为例,添加属性

     

    新建email,添加内容


    Email email = new Email(properties.getProperty("vcard.email")); 

    添加Email的类别为INTERNET,关于类别,可以去查看vCard规范


    email.getTypes().add(EmailType.INTERNET); 

    当添加多个邮箱后,可以设置优先级


    email.setPref(1); 

    vcard.addEmail(email); 

     

     

    其他属性基本类似,具体可以查看官方API,值得一提的是PHOTO使用的是图片的base64,我们可以直接使用以下方式进行添加

     

    package vcfvcardprj;

     

    import java.io.File;

    import java.io.FileInputStream;

    import java.io.FileNotFoundException;

    import java.io.IOException;

    import java.nio.charset.Charset;

    import java.nio.charset.CharsetDecoder;

    import java.nio.charset.CharsetEncoder;

    import java.util.List;

     

    import com.csvreader.CsvReader;

    import com.google.common.base.Joiner;

    import com.google.common.collect.Lists;

     

    import ezvcard.Ezvcard;

    import ezvcard.VCard;

    import ezvcard.VCardVersion;

    import ezvcard.parameter.TelephoneType;

    import ezvcard.property.Nickname;

     

    public class vcfVcardDemo {

     

    public static void main(String[] args) throws IOException {

     

    String filePath="C:\\Users\\Administrator\\Desktop\\telbook.txt";

      // 创建CSV读对象

    //  new CsvReader

            CsvReader csvReader = new CsvReader(  new FileInputStream(new File(filePath)) , Charset.forName("utf8"));

     

            List li=Lists.newArrayList();

            // 读表头

          //  csvReader.readHeaders();

            while (csvReader.readRecord()){

                // 读一整行

                System.out.println(csvReader.getRawRecord());

                // 读这行的某一列

                System.out.println(csvReader.get(0));

          //      System.out.println(csvReader.get("Link"));

                VCard vcard = new VCard(); 

                vcard.setFormattedName(csvReader.get(1));

                vcard.addTelephoneNumber(csvReader.get(0), TelephoneType.CELL);

       //         vcard.addNickname( new Nickname().set csvReader.get(1));

             

              String str = Ezvcard.write(vcard).version(VCardVersion.V3_0).go();

              li.add(str);

            }

            

            String s=Joiner.on("\r\n").join(li);

     System.out.println(s);

     

    }

    }

     

     

     

    Photo photo = new Photo(new File("D://photo.jpg"), ImageType.JPEG); 

    关于自定义属性

    VCardProperty QQ = new RawProperty("X-QQ", properties.getProperty("vcard.qq")); 

    vcard.addProperty(QQ); 

    所有属性添加完成后,编写main方法

    public static void main(String[] args) { VCardUtil vCardUtil = new VCardUtil(); VCard vCard = vCardUtil.createVCard(vCardUtil.getProperties()); String s = Ezvcard.write(vCard).version(VCardVersion.V4_0).go(); System.out.println(s); } 

    添加getStringVCard() 测试

    /**

    * 获取字符串形式的vcard

    * @param vCard vcard

    * @return

    */ public String getStringVCard(VCard vCard){ CharArrayWriter charArrayWriter = new CharArrayWriter(); VCardWriter vCardWriter = null; try { //定义vcard输出流

    vCardWriter = new VCardWriter(charArrayWriter,VCardVersion.V3_0); //设置每行的长度,null为不限制

    vCardWriter.getRawWriter().getFoldedLineWriter().setLineLength(null); //讲vCard写到输出流里面

    vCardWriter.write(vCard); } catch (IOException e) { 

    e.printStackTrace(); }finally { if (vCardWriter != null) try { 

    vCardWriter.close(); } catch (IOException e) { 

    e.printStackTrace(); } } return charArrayWriter.toString(); } 

     

    官方也给出了输出到File的例子,和一些设置信息

     

    Example:

    VCard vcard1 = ... VCard vcard2 = ... File file = new File("vcard.vcf"); VCardWriter writer = null; try { 

    writer = new VCardWriter(file, VCardVersion.V3_0); 

    writer.write(vcard1); 

    writer.write(vcard2); } finally { if (writer != null) writer.close(); } Changing the line folding settings:

     

    VCardWriter writer = new VCardWriter(...);//disable line folding

    writer.getRawWriter().getFoldedLineWriter().setLineLength(null);//change line length

    writer.getRawWriter().getFoldedLineWriter().setLineLength(50);//change folded line indent string

    writer.getRawWriter().getFoldedLineWriter().setIndent("/t");//change newline character

    writer.getRawWriter().getFoldedLineWriter().setNewline("**"); 

    后记: 

    目前可能部分手机不支持4.0格式的vCard,比如猴米就只支持3.0格式的

     

    小米手机关于3.0版本头像支持问题

     

    3.0版本的PHOTO格式为:


    PHOTO;ENCODING=b;TYPE=jpeg:…… 

    维基百科上写的也是ENCODING=b

     

     

     

  • 相关阅读:
    QFramework 使用指南 2020(二):下载与版本介绍
    QFramework 使用指南 2020 (一): 概述
    Unity 游戏框架搭建 2018 (二) 单例的模板与最佳实践
    Unity 游戏框架搭建 2018 (一) 架构、框架与 QFramework 简介
    Unity 游戏框架搭建 2017 (二十三) 重构小工具 Platform
    Unity 游戏框架搭建 2017 (二十二) 简易引用计数器
    Unity 游戏框架搭建 2017 (二十一) 使用对象池时的一些细节
    你确定你会写 Dockerfile 吗?
    小白学 Python 爬虫(8):网页基础
    老司机大型车祸现场
  • 原文地址:https://www.cnblogs.com/attilax/p/15197499.html
Copyright © 2011-2022 走看看