【问题标题】:Include only person-based contacts when querying ContactsContract.Contacts查询 ContactsContract.Contacts 时仅包括基于个人的联系人
【发布时间】:2015-12-21 14:53:55
【问题描述】:

我有一个 SearchView,如果我在其中键入一个名称,它会显示一个匹配它的名称的自动完成列表。但是,Facebook ambulanceAL Cricket 等联系人也会出现在这些结果中。如何排除此类结果并仅获取那些与实际人员有关的联系人?

我用来获取显示名称的代码是这样的:

  private String getDisplayNameForContact(Intent intent) {
    Cursor phoneCursor = getContentResolver().query(intent.getData(), null, null, null, null);
    phoneCursor.moveToFirst();
    int idDisplayName = phoneCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
    String name = phoneCursor.getString(idDisplayName);
    phoneCursor.close();
    return name;
}

【问题讨论】:

    标签: android android-contacts


    【解决方案1】:

    您需要向您的contentResolver.query 添加选择和选择参数。

    你想要的参数是:

    String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = ?";
    String[] selectionArgs = {"1"};
    

    你像这样添加它们:

    ContentResolver contentResolver = getActivity().getContentResolver();
    Cursor contactsCursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, selection, selectionArgs, ContactsContract.Contacts.DISPLAY_NAME_PRIMARY);
    

    常量ContactsContract.Contacts.IN_VISIBLE_GROUP 确定您要查询的联系人子组。

    【讨论】:

    • 你通过意图传递给函数什么?
    • 我有一个 searchView... 如果我输入 a.. 它会显示所有带有 a 的联系人,如果我输入 af.. 同样,所以它本质上是用于自动完成.. 那是数据我正在通过意图
    • 听起来您可能正在以不规则的模式实现搜索。如果您希望这在用户键入时快速发生,您不应该在每次发生更改时都进行查询。这将太慢。您应该查询联系人列表 1 次,然后实施过滤器。请参阅此帖子:stackoverflow.com/questions/14038331/… 您无需使用意图将数据发送到函数。 Intents 用于在应用程序、活动或片段等系统元素之间发送数据。
    【解决方案2】:

    如您所见,当您调用 - query(intent.getData(), null, null, null, null) - 获取所有列表数据。哪里是空,那里是你的选择参数。剩下的只是选择适当的选项。试试我的例子,并使用不同的值(ContactsContract.CommonDataKinds.SomethingElse)。

    我希望这会有所帮助。

    private static Cursor allContactsQuery(Context context) {
        final String[] CONTACTS = new String[]{
                ContactsContract.CommonDataKinds.Phone._ID,
                ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
                ContactsContract.Contacts.DISPLAY_NAME_PRIMARY,
                ContactsContract.CommonDataKinds.Phone.NUMBER,
                ContactsContract.CommonDataKinds.Phone.TYPE,
                ContactsContract.CommonDataKinds.Phone.LABEL,
                ContactsContract.Contacts.PHOTO_THUMBNAIL_URI,
                ContactsContract.Contacts.LOOKUP_KEY,
        };
    
        String SELECTION = ContactsContract.Contacts.DISPLAY_NAME_PRIMARY +
                "<>''" + " AND " + ContactsContract.Contacts.IN_VISIBLE_GROUP + "=1" +
                " AND " + ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1";
        final String[] SELECTION_ARGS = null;
        final String SORT_ORDER = ContactsContract.Contacts.SORT_KEY_PRIMARY;
    
        Cursor cursor = context.getContentResolver().query(
                ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                CONTACTS,
                SELECTION,
                SELECTION_ARGS,
                SORT_ORDER);
        return cursor;
    }
    

    【讨论】:

    • 排除非人员联系人的过滤器是什么?
    • 当您使用 ContactsContract.CommonDataKinds.Phone -。这意味着只需要用户联系人列表。但我不确定。因为另一个客户端程序有权将更改添加到 ContentManager。
    • 你应该尝试只获取带有电话号码的联系人
    猜你喜欢
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 2018-08-07
    • 2011-08-31
    • 1970-01-01
    • 2011-03-07
    相关资源
    最近更新 更多