Android。按 phone 号码从通讯录中检索名字和姓氏
Android. Retrieve first name and last name from contact book by phone number
我正在尝试通过 phone 号码获取通讯录中的名字和姓氏。
这是我的代码:
Uri contactUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
Cursor cursor = cResolver.query(uri, null, null, null, null);
if(cursor != null && cursor.moveToFirst()) {
int idColumnIndex = cursor.getColumnIndex(ContactsContract.Contacts._ID);
int firstNameIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME);
int lastNameIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME);
while (!cursor.isAfterLast()) {
long id = cursor.getLong(idColumnIndex);
contact = new MyContact();
contact.setId(id);
contact.setFirstName(cursor.getString(firstNameIndex));
contact.setLastName(cursor.getString(lastNameIndex));
}
cursor.close();
}
但是 firstNameIndex 和 lastNameIndex 始终为 -1。我做错了什么?请帮助我。
PhoneLookup 是一种通过 phone 号码获取联系人数据的好方法,但它 returns 光标仅限于 columns mentioned in the docs.
您可以看到有 DISPLAY_NAME
可以访问,但不能访问 GIVEN_NAME
、FAMILY_NAME
。
GIVEN_NAME
& FAMILY_NAME
是存储在 Data
table 中的字段,这意味着您需要单独查询 table 才能找到这些字段.
因此,您可以使用从 PhoneLookup
获得的联系人 ID 添加另一个查询(请注意,对于每个查找 phone,可能会返回多个联系人)。
这是从联系人 ID 获取 first/last 姓名的示例方法:
private void addNames(MyContact contact, long contactId) {
String[] projection = new String[] {StructuredName.GIVEN_NAME, StructuredName.FAMILY_NAME};
// filter to just StructuredName rows from the data table for the given contact
String selection = Data.CONTACT_ID + "=" + contactID + " AND " + Data.MIMETYPE + "=" + StructuredName.CONTENT_ITEM_TYPE;
Cursor cursor = getContentResolver().query(Data.CONTENT_URI, projection, selection, null, null);
if (cursor.next()) {
contact.setFirstName(cursor.getString(0));
contact.setLastName(cursor.getString(1));
}
cursor.close();
}
我正在尝试通过 phone 号码获取通讯录中的名字和姓氏。 这是我的代码:
Uri contactUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
Cursor cursor = cResolver.query(uri, null, null, null, null);
if(cursor != null && cursor.moveToFirst()) {
int idColumnIndex = cursor.getColumnIndex(ContactsContract.Contacts._ID);
int firstNameIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME);
int lastNameIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME);
while (!cursor.isAfterLast()) {
long id = cursor.getLong(idColumnIndex);
contact = new MyContact();
contact.setId(id);
contact.setFirstName(cursor.getString(firstNameIndex));
contact.setLastName(cursor.getString(lastNameIndex));
}
cursor.close();
}
但是 firstNameIndex 和 lastNameIndex 始终为 -1。我做错了什么?请帮助我。
PhoneLookup 是一种通过 phone 号码获取联系人数据的好方法,但它 returns 光标仅限于 columns mentioned in the docs.
您可以看到有 DISPLAY_NAME
可以访问,但不能访问 GIVEN_NAME
、FAMILY_NAME
。
GIVEN_NAME
& FAMILY_NAME
是存储在 Data
table 中的字段,这意味着您需要单独查询 table 才能找到这些字段.
因此,您可以使用从 PhoneLookup
获得的联系人 ID 添加另一个查询(请注意,对于每个查找 phone,可能会返回多个联系人)。
这是从联系人 ID 获取 first/last 姓名的示例方法:
private void addNames(MyContact contact, long contactId) {
String[] projection = new String[] {StructuredName.GIVEN_NAME, StructuredName.FAMILY_NAME};
// filter to just StructuredName rows from the data table for the given contact
String selection = Data.CONTACT_ID + "=" + contactID + " AND " + Data.MIMETYPE + "=" + StructuredName.CONTENT_ITEM_TYPE;
Cursor cursor = getContentResolver().query(Data.CONTENT_URI, projection, selection, null, null);
if (cursor.next()) {
contact.setFirstName(cursor.getString(0));
contact.setLastName(cursor.getString(1));
}
cursor.close();
}