8

我想知道是否有一种干净的方法可以将 vcard 导入为 android 联系人。我有一个 vcard 解析器,但映射每个可能的 vcard 字段和字段类型将是一个痛苦的、容易出错的练习。有没有更好的办法?

一个 android 联系人看起来很像 vcard,所以我怀疑他们在内部使用 vcard。然而,没有公开的 API。

4

2 回答 2

10

一个 android 联系人看起来很像 vcard,所以我怀疑他们在内部使用 vcard。

我认为这比在内部使用“vCard”要复杂得多,尤其是因为 vCard 实际上只是一种文本文件格式,因此存储效率低下,搜索大量此类文件更是如此。

ContactsContract概述(注意我在提到“三层数据模型”时将其删减)...

概述

ContactsContract 定义了一个可扩展的联系人相关信息数据库。联系信息存储在三层数据模型中:

据我所知,有一种方法可以“提取”与个人联系人相关的 vCard,但我不知道有一种方法可以从 vCard 中创建联系人。

编辑:在浏览器中单击链接时 WRT 导入 vCard - 是的,好点。我可以确认至少在通过蓝牙接收 vCard 时它可以工作(当然,这是非常合乎逻辑的)。如果我在手机上“打开”vCard,我会收到一个“选择器”,询问我是要使用“文件编辑器”还是“人物”(HTC 联系人应用程序 - 不确定在其他手机上是否也这样称呼)。如果只有一张 vCard,则无需进一步提示即可导入。如果有多个,我会得到另一个选择器,询问我是否要导入 One/Multiple/All(Multiple 提供另一个带有复选框的选择器来进行选择)。

从理论上讲,我想,可能有可能将整个 .vcf 文件加载到某个目录中,并编写一些代码来简单地创建一个 Intent 来“打开”其中一个,并将其与 startActivity() 一起使用,而无需指定哪个活动使用。我不确定这里将使用哪个意图操作,但我会从 ACTION_VIEW 开始 - 其他选择可能是 ACTION_EDIT 或(勉强)ACTION_RUN。

尽管这可能在已知环境中工作,尤其是一次性使用,但它有点混乱,并且行为/结果可能会因不同的手机、Android 版本和联系人应用程序而异。

EDIT2: WRT 使用 Intent 处理 .vcf 文件,我只从我的 SD 卡尝试过 - 我不知道如何在不先保存的情况下进行操作。以下内容准确再现了我打开通过蓝牙发送的 vCard 时看到的内容...

Intent i = new Intent();
i.setAction(android.content.Intent.ACTION_VIEW);
i.setDataAndType(Uri.parse("file:///mnt/sdcard/downloads/bluetooth/MickeyMouse.vcf"), "text/x-vcard");
startActivity(i);
于 2011-01-05T01:27:18.197 回答
0

我在 Android 中将联系人作为 vCard 导入时遇到了很多困难,在花了很多时间后,我发现没有用于导入联系人的公共 API。

据我所知,唯一的方法是重用 Android 的源代码。我通过重用 Android 2.1 源代码实现了同样的目的。

文件可以参考

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/pim/vcard/exception/VCardException.java/

在右侧的资源管理器中,您将在 pim 文件夹下找到所需的所有文件。负责启动程序的文件是 ImportVCardActivity.java

我希望它有帮助!

于 2011-01-06T03:41:07.447 回答