Android获取全部联系人并排除仅邮箱联系人的实现方法
如何过滤Android中仅含邮箱的联系人?
你遇到的这个问题很常见——默认的联系人查询会返回所有条目,包括那些只有邮箱没有电话号码的联系人。要过滤掉这类联系人,我们可以利用ContactsContract.Contacts.HAS_PHONE_NUMBER这个字段来做筛选,它会标记联系人是否关联了电话号码。
具体修改步骤:
- 添加筛选条件:在你的
CursorLoader查询中,设置SELECTION参数为ContactsContract.Contacts.HAS_PHONE_NUMBER + " = 1",这样只会获取拥有电话号码的联系人。 - (可选)扩展投影字段:如果你需要在代码里确认联系人是否有电话,可以把
HAS_PHONE_NUMBER加入到projectionFields数组中,不过只做筛选的话这一步不是必须的。
修改后的完整代码:
String[] projectionFields = new String[]{ ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, // 可选:如果需要用到这个字段的值,可以添加进来 ContactsContract.Contacts.HAS_PHONE_NUMBER }; // 设置筛选条件:只获取有电话号码的联系人 String SELECTION = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = 1"; CursorLoader cursorLoader = new CursorLoader( context, ContactsContract.Contacts.CONTENT_URI, projectionFields, SELECTION, null, null ); Cursor cursor = cursorLoader.loadInBackground(); if (cursor.moveToFirst()) { int nameIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); do { String contactDisplayName = cursor.getString(nameIndex); // 可选:如果添加了HAS_PHONE_NUMBER字段,可以在这里获取值 // int hasPhoneIndex = cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER); // boolean hasPhone = cursor.getInt(hasPhoneIndex) == 1; } while (cursor.moveToNext()); }
原理说明:
ContactsContract.Contacts.HAS_PHONE_NUMBER是一个整数字段,当联系人至少有一个电话号码时,它的值为1;如果没有任何电话号码(比如仅邮箱的联系人),值为0。通过这个条件筛选后,查询结果就只会包含有电话号码的联系人,自然就排除了仅邮箱的条目。
内容的提问来源于stack exchange,提问作者Mayur Rokade
相关产品推荐
相关产品推荐

