在Android中使用ContactsContract检索电话号码 - 功能不起作用

caw*_*caw 4 java android phone-number android-contacts

我编写了以下函数,以便检索属于ID为"contactID"的联系人的一个电话号码.

检索电话号码的功能:

private String getContactPhone(String contactID) {
    Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
    String[] projection = null;
    String where = ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?";
    String[] selectionArgs = new String[] { contactID };
    String sortOrder = null;
    Cursor result = managedQuery(uri, projection, where, selectionArgs, sortOrder);
    if (result.moveToFirst()) {
        String phone = result.getString(result.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        if (phone == null) {
            result.close();
            return null;
        }
        result.close();
        return phone;
    }
    result.close();
    return null;
}
Run Code Online (Sandbox Code Playgroud)

如何调用此函数:

ArrayList<Contact> resultContacts = new ArrayList<Contact>();
Cursor result = null;
Uri uri = ContactsContract.Data.CONTENT_URI;
String[] projection = new String[] {
        ContactsContract.Contacts._ID,
        ContactsContract.Contacts.DISPLAY_NAME,
        ContactsContract.CommonDataKinds.Event.CONTACT_ID,
        ContactsContract.CommonDataKinds.Event.START_DATE,
};
String where = ContactsContract.Data.MIMETYPE+" = ? AND "+ContactsContract.CommonDataKinds.Event.TYPE+" = "+ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY;
String[] selectionArgs = new String[] {ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE};
String sortOrder = null;
result = managedQuery(uri, projection, where, selectionArgs, sortOrder);
while (result.moveToNext()) {
    Long id = result.getLong(result.getColumnIndex(ContactsContract.Contacts._ID));
    String phone = getContactPhone(String.valueOf(id));
    ...
}
...
Run Code Online (Sandbox Code Playgroud)

不幸的是,它不起作用.如果我用"ContactsContract.Contacts._ID"中的值调用此函数,则为null.为什么会这样?怎么了?

编辑:我曾经将Contacts._ID映射到CommonDataKinds.Phone.CONTACT_ID - 这不起作用.但现在我将Contacts.DISPLAY_NAME映射到CommonDataKinds.Phone.DISPLAY_NAME,它突然工作 - 奇怪,不是吗?但我更愿意映射ID而不是显示名称.所以问题仍然是热门话题.这可能是由于这些表中的ID不同吗?这不是为什么有查找ID?

tid*_*eck 11

要获取第一部分中的联系人ID,您应该使用:

ContactsContract.Data.CONTACT_ID
Run Code Online (Sandbox Code Playgroud)

代替:

ContactsContract.Contacts._ID
Run Code Online (Sandbox Code Playgroud)

所以投影应该是:

String[] projection = new String[] {
         ContactsContract.Data.CONTACT_ID,
         ContactsContract.CommonDataKinds.Event.CONTACT_ID,
         ContactsContract.CommonDataKinds.Event.START_DATE,
 };
Run Code Online (Sandbox Code Playgroud)

然后当然得到正确的行:

Long id = result.getLong(result.getColumnIndex(ContactsContract.Data.CONTACT_ID));
Run Code Online (Sandbox Code Playgroud)

  • 使用`Contacts._ID`,您实际上将得到`Data._ID`列,因为它们都是``_id'`.你想要的列是"contact_id",因为你从uri`ContactsContract.Data.CONTENT_URI`中提取数据. (2认同)