获取没有照片的电话联系人,以便将它们保存为 DataOutputStream(vcf 格式)

Posted

技术标签:

【中文标题】获取没有照片的电话联系人,以便将它们保存为 DataOutputStream(vcf 格式)【英文标题】:Get phone contacts without the photos in order to save them in a DataOutputStream(vcf format) 【发布时间】:2014-03-19 21:03:31 【问题描述】:

我有一个应用程序可以将手机联系人以 vcf 格式导出到 sdcard。

我能够获取所有 vcard 并将它们保存为 vcf 格式(在每个 ContactsContract.Contacts.LOOKUP_KEY 上循环,直到达到光标计数 -1 以便放置与每个相关的 vcard在 AssetFileDescriptor 中联系,然后使用 getContentResolver().openAssetFileDescriptor(....) 转换为 FileInputStream。问题是现在我需要保存 没有照片的电子名片。

那么知道如何获取联系人没有他们的照片,以便将它们以 vcf 格式保存在外部存储上吗?

提前致谢

【问题讨论】:

在存储前将现有 vcard 中的非照片数据克隆到空白 vcard 中? @CeilingGecko 没有明白你的想法 @androidNabs 我认为他的意思是你应该为每个 vcard 创建一个新的 vcard 并复制除图片之外的所有数据并保存新的 vcard @OriWasserman 我明白了,但你不觉得这对设备来说是一个艰难而沉重的方法吗?我正在寻找一种方法来查询没有照片行的联系人的所有行。有办法吗? 【参考方案1】:

API 级别 14 +

如果您查看ContactsContract.java 的来源,您会发现他们引入了一种排除联系人照片的新方法。

/**
 * Boolean parameter that may be used with @link #CONTENT_VCARD_URI
 * and @link #CONTENT_MULTI_VCARD_URI to indicate that the returned
 * vcard should not contain a photo.
 *
 * @hide
 */
 public static final String QUERY_PARAMETER_VCARD_NO_PHOTO = "nophoto";

该常量对 API 隐藏 (@hide),但您仍然可以利用它。

获取查找键后,您可以使用以下代码获取“nophoto”vcard Uri:

String lookupKey = cursor.getString(
                 cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
Uri vcardUri = ContactsContract.Contacts.CONTENT_VCARD_URI
             .buildUpon().appendQueryParameter("nophoto", String.valueOf(true))
             .build();
Uri uri = Uri.withAppendedPath(vcardUri, lookupKey);

Pre API 级别 14

您唯一的解决方案是使用联系信息构建您自己的电子名片。

这个library 可能会有所帮助。

【讨论】:

你的方法就像一个魅力,我将使用 API>14 的“nophoto”参数,我将通过使用外部库处理 vcards 来处理 API

以上是关于获取没有照片的电话联系人,以便将它们保存为 DataOutputStream(vcf 格式)的主要内容,如果未能解决你的问题,请参考以下文章

将联系人保存为“电话联系人”

Android 手机联系人仅包含照片、电话和姓名

Android:尝试设置为 ImageView 时,联系人照片像素化

如何仅使用他们的电话号码获取联系人姓名?

安卓怎么设置来电照片

仅当他们有电话号码时,如何获取所有联系人的全名和电话号码?