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

时间:2011-09-25 12:54:45

标签: android contacts

我正在尝试使用表单中已有的一些数据启动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字段添加到intent ...

有人知道这是如何做得好的吗?

注意:我没有尝试直接添加联系人,但我想打开一个填充的“添加联系人”对话框!

由于 咄

1 个答案:

答案 0 :(得分:2)

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

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

使用ContentProvider动态创建vCards的简单示例:

在您的活动中:

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那样具有脑死亡编码。

在最重要的方面,此方法还允许您添加工作/移动和其他数字(以及更多)。