Android联系人选择器

时间:2011-11-26 00:19:46

标签: android-contacts

我在想:

是否可以自定义Android联系人选择器,以便它还可以允许在默认联系人列表中添加新联系人作为菜单选项?

目前,如果我从我的活动中调用联系人选择器,它只显示默认联系人列表。我还希望用户能够创建新联系人(如果它尚不存在)。我已经搜索了很多但是没有找到合适的API来执行此操作。就我所见,ContactContract中没有任何内容。


任何输入都将受到赞赏。我有一个HTC的感觉,在编写短信的消息应用程序中,弹出的联系人选择器有一个搜索栏,联系人列表和选项菜单,你可以选择添加新的联系人。这是如何实现的?

1 个答案:

答案 0 :(得分:4)

我理解你的问题,不,这是不可能的。这是因为Android联系人框架将添加和选择视为逻辑上不同的操作,应该使用不同的意图启动。如果您使用意图Intent.ACTION_PICK启动联系人选择器,您将看到一个特定于选择器的联系人UI版本,其中包含所有内容(例如,添加或删除联系人),这与此操作无关。

要查看无法解决的原因,请在ContactsListActivity中查看股票联系人应用的代码。根据启动活动的意图,它可能是代码中定义的几种“模式”之一,它控制UI如何呈现自身以及允许哪些行为。如果你查看活动的onCreate()方法,你会看到:

(N.B。我正在查看GrepCode上的Android 2.3.7源代码)

mMode = MODE_UNKNOWN;
if (UI.LIST_DEFAULT.equals(action) || UI.FILTER_CONTACTS_ACTION.equals(action)) {
    mMode = MODE_DEFAULT;
[...]

} else if (Intent.ACTION_PICK.equals(action)) {
   // XXX These should be showing the data from the URI given in
   // the Intent.
   final String type = intent.resolveType(this);
   if (Contacts.CONTENT_TYPE.equals(type)) {
      mMode = MODE_PICK_CONTACT;
   }
[...]

所以我们看到意图Intent.ACTION_PICK,UI被置于“选择器”模式。然后再往下看:

public boolean onCreateOptionsMenu(Menu menu) {
  super.onCreateOptionsMenu(menu);

  // If Contacts was invoked by another Activity simply as a way of
  // picking a contact, don't show the options menu
  if ((mMode & MODE_MASK_PICKER) == MODE_MASK_PICKER) {
       return false;
  }

  MenuInflater inflater = getMenuInflater();
  inflater.inflate(R.menu.list, menu);
  return true;
}

这就是为什么当您启动联系人选择器时没有选项菜单的原因 - 用户界面选择以某种方式呈现自己,因为您在启动选择器时的意图,即仅选择。

如果您要执行的操作是添加联系人,则需要启动具有不同意图的联系人,尤其是Intent.ACTION_INSERT_OR_EDIT。 (在onCreate()中,您将看到类似于上面的部分,如果收到此意图,活动的模式将设置为“添加/编辑”值。)