如何通过意图添加具有名字和姓氏的联系人

Posted

技术标签:

【中文标题】如何通过意图添加具有名字和姓氏的联系人【英文标题】:How to add a contact with first name and last name via intent 【发布时间】:2011-11-24 15:03:34 【问题描述】:

我正在尝试使用表单中已有的一些数据启动 android 原生“添加或编辑联系人”活动。这是我目前使用的代码:

Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
intent.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE);

intent.putExtra(Insert.NAME, "A name");
intent.putExtra(Insert.PHONE, "123456789");
startActivity(intent);

我的问题是我想指定名字和姓氏。我还注意到有一个 StructuredName 类,其中包含我需要的所有字段的常量标识符。不幸的是,我无法将 StructuredName 字段添加到意图中......

有人知道这是如何正确完成的吗?

注意:我不是要直接添加联系人,而是要打开一个填充的“添加联系人”对话框!

谢谢 呵呵

【问题讨论】:

【参考方案1】:

ContactsContract.Intents.Insert 中的大多数/所有值都在默认联系人应用程序的 model/EntityModifier.java 类中进行处理 - 这只是将 Insert.NAME 中的值填充到 StructuredName.GIVEN_NAME 中。

您可以尝试将其作为支持所有名称组件的 vCard 2.1 (text/x-vcard) 导入,但要求您将 vCard 文件转储到 sdcard 上或提供 ContentResolver#openInputStream(Uri) 可以读取的内容(通常是sdcard 上的文件或指向您自己的 ContentProvider 的 URI)。

一个使用 ContentProvider 动态创建 vCard 的简单示例:

在您的活动中:

Intent i = new Intent(Intent.ACTION_VIEW);
i.setDataAndType(Uri.parse("content://some.authority/N:Jones;Bob\nTEL:123456790\n"), "text/x-vcard");
startActivity(i);

在您的 ContentProvider 中(为 ACTION_VIEW Intent 中使用的权限注册):

public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException 
  try 
    FileOutputStream fos = getContext().openFileOutput("filename.txt", Context.MODE_PRIVATE);
    String vcard = "BEGIN:VCARD\nVERSION:2.1\n" +
        uri.getPath().substring(1) +
        "END:VCARD\n";
    fos.write(vcard.getBytes("UTF-8"));
    fos.close();
    return ParcelFileDescriptor.open(new File(getContext().getFilesDir(), "filename.txt"), ParcelFileDescriptor.MODE_READ_ONLY);
   catch (IOException e) 
    throw new FileNotFoundException();
  

这应该在触发时插入一个联系人,该联系人的名称是您在 Uri 路径中放置的任何内容到电话簿中。如果用户有多个联系人帐户,他/她将被要求选择一个。

注意: vCard 的正确编码当然会被完全忽略。我认为联系人应用程序的大多数版本应该支持 vCard 3.0,它也没有像 vCard 2.1 那样的脑死编码。

从好的方面来说,此方法还允许您添加工作/手机号码和其他号码(以及更多)。

【讨论】:

哦,快。注意到您还想编辑该死的东西 - 在大多数情况下,这将只是添加联系人 - 如果您定义了帐户名称和类型 - 甚至不要求用户确认(像往常一样存在巨大的安全漏洞)。 感谢詹斯的回答。这确实是一种有趣的(尽管很老套)的方法。是否有办法通过 ACTION_INSERT_OR_EDIT 将 vcard(在某个抽象层上)传递给意图? 我不知道 - ACTION_INSERT_OR_EDIT 意图在默认联系人应用程序中支持的内容非常有限。

以上是关于如何通过意图添加具有名字和姓氏的联系人的主要内容,如果未能解决你的问题,请参考以下文章

如何从联系人中获取电子邮件和姓氏?

如何在 Android 2.1 中使用姓氏字段预填充“添加联系人”活动?

如何从android中的单个查询中获取联系人的名字,姓氏,电子邮件ID

如何在搜索栏中按名字和姓氏排序 - Sqlite

如何从联系信息中获取名字和姓氏?

通过具有多个电话号码的意图添加新联系人