Android的联系人选择器

问题描述:

我想知道:Android的联系人选择器

是否可以自定义Android的联系人选择器,这样还可以让添加新联系人作为默认联系人列表的菜单选项?

目前,如果我从我的活动中调用联系人选择器,它只会显示默认联系人列表。我还希望用户能够创建一个新的联系人,如果它不存在。我已经搜索了很多,但没有找到适当的API来做到这一点。据我所知,ContactContract中没有任何内容。


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

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

要查看为什么不可能,请在ContactsListActivity中查找股票联系人应用程序的代码。根据哪个意图启动活动,它可能处于代码中定义的几个“模式”之一,这些“模式”控制UI呈现自己的方式以及允许的行为。如果您在活动的onCreate()方法看,你会看到:

(NB我看的Android 2.3.7源在GrepCode

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见用户界面正在进入“选择器”模式。再往你看:

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()中,你会看到一个与上面类似的部分,如果收到这个意图,活动的模式被设置为“添加/编辑”值。)