联系人选择器过滤

问题描述:

我使用联系人选取了这种方式:联系人选择器过滤

Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI); 
    this.startActivityForResult(intent, PICK_CONTACT_REQUEST); 

我的问题是,如果可以过滤莫名其妙的联系人列表?例如,我只想查看联系人列表中至少包含电话号码或电子邮件地址的联系人。

我会建议使用您的自定义视图的联系人 - 这不是很困难,你可以自定义它,但是你想要的。我亲自实施了你需要的功能。

在这里看到:

String PHONE_CONTACTS_ORDER_CLAUSE = ContactsContract.Contacts.DISPLAY_NAME 
     + " ASC"; 

List<PhoneContact> contacts = new ArrayList<PhoneContact>(); // I have defined the bean PhoneContact 
String[] projection = { ContactsContract.Contacts._ID, 
     ContactsContract.Contacts.DISPLAY_NAME }; //Choose the columns you need 
Cursor cursor = this.getContentResolver().query(
     ContactsContract.Contacts.CONTENT_URI, projection, null/* the place for your where clause*/, null/* the place for your where args*/, 
     PHONE_CONTACTS_ORDER_CLAUSE); 
startManagingCursor(cursor); 

int contactIdIdx = cursor.getColumnIndex(ContactsContract.Contacts._ID); 
int displayNameIdx = cursor 
     .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); 
while (cursor.moveToNext()) { 
    PhoneContact contact = new PhoneContact(); // This is a class i defined, use the data the way you like. 
    contact.setContactId(cursor.getString(contactIdIdx)); 
    contact.setDisplayName(cursor.getString(displayNameIdx)); 
    contacts.add(contact); 
} 

编辑 对不起写评论时得到了分散注意力的接触式ID实际上是联系相关数据的不同内容提供商之间的粘合剂。这些都是几个供应商可以使用,看看是否有任何关联的电话或电子邮件与该联系人:

ContactsContract.CommonDataKinds.Phone.CONTENT_URI 
ContactsContract.CommonDataKinds.Email.CONTENT_URI 
+0

这种方法的缺点是,它需要的'READ_CONTACTS'权限查询联系人提供商。 – tad 2013-10-31 20:55:00

+0

@tad:替代总是感激! – 2013-11-01 08:15:19

+0

如果你想坚持全球意图而不是添加权限,那么没有纯粹的选择。您只能使用Intent.setType(ContactsContract.CommonDataKinds.Email.CONTENT_TYPE)或Intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE)'一次过滤一个属性。如果您不想添加'READ_CONTACTS',请重新设计此交互以通过电话或电子邮件进行选择。 – tad 2013-11-01 18:34:56