Android:我正在尝试根据其显示名称搜索联系人



我正在尝试根据其显示名称搜索联系人。我从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
    );
}

最新更新