Android 检索联系人的所有电话号码

Android 检索联系人的所有电话号码,android,cursor,android-contacts,Android,Cursor,Android Contacts,我已经看到了其他类似的问题,但没有一个有效。 通过下面的代码,我可以获得联系人的默认电话号码,但不是全部 Cursor contact = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null); contact.mov

我已经看到了其他类似的问题,但没有一个有效。 通过下面的代码,我可以获得联系人的默认电话号码,但不是全部

Cursor contact = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);
contact.moveToFirst();

phoneNumberList.add(contact.getString(contact.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
然后,我尝试创建多个游标,其中包含有关电话类型的更多详细信息,然后将它们添加到列表中:

Cursor contact = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER}, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ? AND " + ContactsContract.CommonDataKinds.Phone.TYPE + " = " + ContactsContract.CommonDataKinds.Phone.TYPE_HOME, new String[]{contactID}, null);

但不幸的是,它没有解决任何问题。如果有人能帮我解决这个问题,我将不胜感激。

我假设您想获取所有电话号码及其类型(家庭、手机、主网络等)

下面是操作方法(手机列表将打印到log=:

String projection = new String[] { Phone.NUMBER, Phone.TYPE, Phone.LABEL };
String selection = Phone.CONTACT_ID + "=" + contactId;
Cursor cur = getContentResolver().query(Phone.CONTENT_URI, projection, selection, null, null); 
while (cur != null && cur.moveToNext()) {
    String number = cur.getString(0);
    int type = cur.getInt(1);        // home / office / personal
    String label = cur.getString(2); // a custom label in case type is "TYPE_CUSTOM"
    String labelStr = Phone.getTypeLabel(getResources(), type, label);

    Log.d(TAG, "got a phone: " + number + " (" + labelStr + ")");
}
if (cur != null) {
    cur.close();
}
调试版本

String projection = new String[] { Phone._ID, Phone.CONTACT_ID, Phone.NUMBER, Phone.TYPE, Phone.LABEL };
String selection = Phone.CONTACT_ID + "=" + contactId;
Cursor cur = getContentResolver().query(Phone.CONTENT_URI, projection, selection, null, null); 
if (cur != null) {
    DatabaseUtils.dumpCursor(cur);
    cur.close();
}

不幸的是,您的代码也会返回联系人的默认电话号码,而不是全部号码。(a)您确定要测试此功能的联系人有多个电话号码吗?(b)您正在运行确切的代码,还是只是将查询行复制到您的代码中?a)是的,我检查了几次,b)我使用了您的确切代码。显然,
cur.getString(0)
Phone.NUMBER
总是返回api 14+中的默认电话号码。没有意义,我在我的生产应用程序中都使用了这些api,并且它按预期工作。确保
Phone
类是从ContactsContract.CommonDataTypes导入的,我还将添加一个调试版本,以便我们更好地了解结果,运行它并复制日志中的输出。我用另一部手机测试了它,结果正常。不知道为什么,但Galaxy S4可能有缺陷。