java - 如何获取ezvcard中 'encoded'照片数据?

标签 java android vcf-vcard

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

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

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

最佳答案

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

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

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"
  }
}

关于java - 如何获取ezvcard中 'encoded'照片数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26676301/

相关文章:

android - 将 Cookie 从 HttpURLConnection (java.net.CookieManager) 传递到 WebView (android.webkit.CookieManager)

安卓 : Merging/concatenating two audio files hangs up the application

iphone - 如何将联系人从网页添加到 iPhone 的通讯录?

iphone - 如何使用地址簿联系人详细信息在 iPhone 中生成 vcard?

Java ArrayList 是从多个类访问相同列表的好方法

java - ExecutorService - 执行具有特定时间限制的每个任务

android - 在 Android 上为 AIR 和 Flash Player 创建单个 Flash 应用程序

android - Asmack 未加载 VCard

java - 启动运行命令时出现问题

java - Bouncy CaSTLe 与带有 OAEP 的 Java 默认 RSA