【问题标题】:How to get 'encoded' photo data in ezvcard?如何在 ezvcard 中获取“编码”照片数据?
【发布时间】:2014-10-31 13:50:25
【问题描述】:

我正在使用ez-vcard 来解析Android 上的一些VCard 文件。这些 VCard 文件由 Android 的默认联系人应用程序生成。现在这些 VCard 文件的问题在于,这些文件包含由 Android 的Base64 类编码的“PHOTO”属性的数据。所以当我使用Photo#getData() 方法时,我没有得到正确的“解码”数据。所以我一直在寻找一些解决方法,以便获取照片属性的“编码”数据字符串。任何帮助/建议将不胜感激。

编辑: 我很确定 Android 的 Base64 类会产生问题,因为当我使用 ez-vcard 和照片编写 VCard 文件并尝试使用默认联系人应用程序打开此文件时,它给出了VCard 解析错误,但是当我编写由 Android 的 Base64 类编码的照片字符串时,一切正常。

为了获取编码的照片数据字符串,我也尝试使用VCard#getExtendedProperty("PHOTO") 方法,但它返回null

【问题讨论】:

    标签: java android vcf-vcard


    【解决方案1】:

    奇怪的是,Android 的 base64 函数的工作方式不同。我认为,base64 算法应该在任何地方都一样。 o_O

    如果您需要获取 PHOTO 属性的原始字符串值,您可以创建自定义 scribe 和 property 类,然后向解析器注册 scribe 类,如下所示:

    public class PhotoRawScribe extends VCardPropertyScribe<PhotoRaw> {
      public PhotoRawScribe() {
        super(PhotoRaw.class, "PHOTO");
      }
    
      @Override
      protected VCardDataType _defaultDataType(VCardVersion version) {
        return null;
      }
    
      @Override
      protected String _writeText(PhotoRaw property, VCardVersion version) {
        return property.getValue();
      }
    
      @Override
      protected PhotoRaw _parseText(String value, VCardDataType dataType, VCardVersion version, VCardParameters parameters, List<String> warnings) {
        return new PhotoRaw(value);
      }
    }
    
    public class PhotoRaw extends SimpleProperty<String> {
      public PhotoRaw(String value) {
        super(value);
      }
    
      public static void main(String args[]) throws Exception {
        String str = 
        "BEGIN:VCARD\r\n" +
        "VERSION:4.0\r\n" +
        "PHOTO:foobar\r\n" +
        "END:VCARD";
    
        VCardReader reader = new VCardReader(str);
        reader.registerScribe(new PhotoRawScribe());
        VCard vcard = reader.readNext();
    
        PhotoRaw photo = vcard.getProperty(PhotoRaw.class);
        System.out.println(photo.getValue()); //prints "foobar"
      }
    }
    

    【讨论】:

    • 感谢您的回答!我对 Android 的 Base64 也有点惊讶,但从我的经验来看,Android 的 Base64 的工作方式似乎有点不同。或者可能是,这只是 Android 的联系人应用程序的问题。 :)
    猜你喜欢
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多