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

Posted

技术标签:

【中文标题】Android:我正在尝试根据他们的显示名称搜索联系人【英文标题】:Android : I am trying to search for contacts on basis of their display name 【发布时间】:2017-04-20 23:27:15 【问题描述】:

我正在尝试根据显示名称搜索联系人。 我从 android 开发者网站上给出的示例代码中获取了参考。

https://developer.android.com/training/contacts-provider/retrieve-names.html

在此示例中,搜索从联系人中存在的整个联系人详细信息执行,而不仅仅是联系人姓名。

例如,如果用户在他的联系人中有一个电子邮件地址,那么搜索也在匹配电子邮件中执行。 或者如果一个数字存储在 home type 中,那么在输入 h 时,home category 中的数字也会显示出来。

我希望搜索仅限于他们的显示名称。

     final static String SELECTION =
            (Utils.hasHoneycomb() ? Contacts.DISPLAY_NAME_PRIMARY : Contacts.DISPLAY_NAME) +
                    "<>''" + " AND " + Contacts.IN_VISIBLE_GROUP + "=1";

这些是我从示例代码中使用的 selecton 子句。

【问题讨论】:

【参考方案1】:

试试这个

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));
            

【讨论】:

在哪里使用此代码?您检查过示例吗?【参考方案2】:

Retrieving a List of Contacts 教程中的过滤代码在这里:

Uri contentUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode(mSearchString));

在Contacts.CONTENT_FILTER_URI 文档中说:

过滤字符串将用于匹配联系人的各个部分 名字

所以这对你不利,将其替换为:

@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
    );

【讨论】:

以上是关于Android:我正在尝试根据他们的显示名称搜索联系人的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试按名称创建搜索方法,但它显示此错误

按JSON字段搜索名称

根据列值动态更改图标

尝试根据 2 个字母代码显示完整的大陆名称

按姓名搜索联系人

与本机短信应用程序 Android 中的名称和号码自动完成