Android联系人内容URI HAS_PHONE_NUMBER无法按照文档中的说明运行,请指导

时间:2011-09-10 18:18:32

标签: android

我正在尝试运行以下代码。

  ContentResolver cr = getContentResolver();
        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
                null, null, null, null);
        if (cur.getCount() > 0) {
            while (cur.moveToNext()) {
                  String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
                  String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                  if (Integer.parseInt(cur.getString(
                        cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
                     Cursor pCur = cr.query(
                               ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                               null,
                               ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",
                               new String[]{id}, null);
                     while (pCur.moveToNext()) {
                         String phoneNo = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                         Toast.makeText(NativeContentProvider.this, "Name: " + name + ", Phone No: " + phoneNo, Toast.LENGTH_SHORT).show();
                     }
                    pCur.close();
                }
            }
        }
    }

所以基本上我查询Contacts.URI然后根据返回的数据,如果HAS_PHONE_NUMBER> 0,我查询Phone.URI。

当我在手机上运行时,我看到3个联系人显示,他们在PHONE内容URI中没有相应的条目。这三个联系人肯定有电话号码,因为当我进入我的电话拨号屏幕时,我可以看到这些电话号码。

如何使联系人拥有HAS_PHONE_NUMBER> 0并且在PHONE内容URI中仍然没有对应的行。是不是没有经历,以及如何摆脱这种情况。

请告诉我。 感谢。

1 个答案:

答案 0 :(得分:2)

这个小方法根据选项字符串搜索参数获取联系人。它仅提取包含电话号码的联系人。

private Cursor getContactsCursor(String searchPattern){
    String selection = ContactsContract.Contacts.DISPLAY_NAME + " LIKE ? and " + ContactsContract.Contacts.HAS_PHONE_NUMBER + " > 0 ";
    String queryArguments = "%" + searchPattern + "%";
    String[] selectionArgs = new String[] { queryArguments };
    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";

    return getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, selection, selectionArgs, sortOrder);
}