我想知道是否有一种干净的方法可以将 vcard 导入为 android 联系人。我有一个 vcard 解析器,但映射每个可能的 vcard 字段和字段类型将是一个痛苦的、容易出错的练习。有没有更好的办法?
一个 android 联系人看起来很像 vcard,所以我怀疑他们在内部使用 vcard。然而,没有公开的 API。
我想知道是否有一种干净的方法可以将 vcard 导入为 android 联系人。我有一个 vcard 解析器,但映射每个可能的 vcard 字段和字段类型将是一个痛苦的、容易出错的练习。有没有更好的办法?
一个 android 联系人看起来很像 vcard,所以我怀疑他们在内部使用 vcard。然而,没有公开的 API。
一个 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);
我在 Android 中将联系人作为 vCard 导入时遇到了很多困难,在花了很多时间后,我发现没有用于导入联系人的公共 API。
据我所知,唯一的方法是重用 Android 的源代码。我通过重用 Android 2.1 源代码实现了同样的目的。
文件可以参考
在右侧的资源管理器中,您将在 pim 文件夹下找到所需的所有文件。负责启动程序的文件是 ImportVCardActivity.java
我希望它有帮助!