我正在尝试根据其显示名称搜索联系人。我从Android开发人员网站上给出的示例代码中获取了参考。
https://developer.android.com/training/contacts-provider/retrieve-names.html
在此示例中,搜索从联系人名称中存在的整个联系人详细信息中执行。
。例如,如果用户在其联系人中有一个电子邮件地址,则搜索也在匹配电子邮件时执行。 或者,如果存储在家庭类型中,则在键入H时,也显示了HOME类别中的数字。
我希望搜索仅限于他们的显示名称。
final static String SELECTION =
(Utils.hasHoneycomb() ? Contacts.DISPLAY_NAME_PRIMARY : Contacts.DISPLAY_NAME) +
"<>''" + " AND " + Contacts.IN_VISIBLE_GROUP + "=1";
这些是我使用的Selecton子句。
尝试此
Cursor cursor = getContentResolver().query(
android.provider.ContactsContract.Contacts.CONTENT_URI,
new String[] { ContactsContract.Contacts.PHOTO_ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts._ID },
ContactsContract.Contacts.HAS_PHONE_NUMBER, null,
ContactsContract.Contacts.DISPLAY_NAME);
此cursor
给出了所有具有任何电话号码的联系人,然后我将唯一的ID
保存在ArrayList
中,例如此
cursor.moveToFirst();
while (cursor.moveToNext()) {
contactsID.add(cursor.getString(2));
}
然后选择联系人,我使用此
找到了联系电话Cursor cursor = getContentResolver()
.query(android.provider.ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
new String[] {
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME },
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " = ?",
new String[] { contactsID.get(position) }, null);
contactNumbers = new ArrayList<String>();
while (cursor.moveToNext()) {
contactNumbers.add(cursor.getString(0));
Log.d("number", cursor.getString(0));
}
在Retrieving a List of Contacts
教程中进行过滤的代码在这里:
Uri contentUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode(mSearchString));
在contacts.content_filter_uri文档中说:
滤波器字符串将用于匹配 contact的各个部分 名称
所以这对您不利,请替换为:
@Override
public Loader<Cursor> onCreateLoader(int loaderId, Bundle args) {
Uri contentUri = Contacts.CONTENT_URI; // no longer filters
String selection = Contacts.DISPLAY_NAME_PRIMARY + " LIKE %" + mSearchString + "%";
return new CursorLoader(
getActivity(),
contentUri,
PROJECTION,
selection,
null,
null
);
}