Получение идентификатора контакта из базы контактов Android не работает должным образом
У меня есть следующий код.
int phoneContactID = new Random().nextInt();
Cursor contactLookupCursor = context.getContentResolver().query( Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,Uri.encode(contactNumber)), new String[] {PhoneLookup.DISPLAY_NAME, PhoneLookup._ID},null,null,null);
try
{
contactLookupCursor.moveToFirst();
while(contactLookupCursor.moveToNext())
{
phoneContactID = contactLookupCursor.getInt(contactLookupCursor.getColumnIndexOrThrow(PhoneLookup._ID));
}
}
finally
{
contactLookupCursor.close();
}
Проблема в приведенном выше коде заключается в том, что даже если я приведу существующее число в контактах эмулятора, оно не даст никаких результатов. Я тестировал его час назад, и он работал нормально, и теперь, когда я тестировал его снова, ничего не возвращалось. Я не уверен, если что-то не так с кодом. То, что я пытаюсь сделать, это получить идентификатор, который соответствует одному с несколькими номерами. Например, скажем, есть имя контакта под названием "А" и А имеет два числа. По сути, идентификатор контакта для A должен быть 1 независимо от того, на какой номер я ссылаюсь. Правильно ли мое предположение?
ОБНОВЛЕНИЕ: я сделал еще несколько тестов. Скажем, если номер хранится без кода страны в базе данных контактов, как 222-222-2222. Поиск с использованием приведенного ниже кода возвращает идентификатор контакта только тогда, когда я передаю 2222222222 или 222-222-2222. И если тот же номер хранится как 12222222222, действительный идентификатор контакта получен, только если я ищу номер 12222222222.
String[] projection = new String[] {ContactsContract.CommonDataKinds.Phone._ID,ContactsContract.CommonDataKinds.Phone.CONTACT_ID};
Uri contactUri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI, Uri.encode(contactNumber));
Cursor c = context.getContentResolver().query(contactUri, projection, null, null, null);
if (c.moveToFirst()) {
phoneContactID = c.getInt(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
}
Я не уверен, что я делаю что-то здесь не так. Любая помощь будет оценена.
4 ответа
public static int getContactIDFromNumber(String contactNumber,Context context)
{
contactNumber = Uri.encode(contactNumber);
int phoneContactID = new Random().nextInt();
Cursor contactLookupCursor = context.getContentResolver().query(Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,contactNumber),new String[] {PhoneLookup.DISPLAY_NAME, PhoneLookup._ID}, null, null, null);
while(contactLookupCursor.moveToNext()){
phoneContactID = contactLookupCursor.getInt(contactLookupCursor.getColumnIndexOrThrow(PhoneLookup._ID));
}
contactLookupCursor.close();
return phoneContactID;
}
Код, который работает сейчас.
Хорошо... Извините, я пропустил интерпретацию вашего вопроса. Я не сделал этого. Но я думаю, что следующий код может сработать. Дайте ему попробовать и позвольте мне знать:
Cursor phone_cursor = cr.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.NUMBER + " = ?",
new String[]{"YOUR NUMBER GOES HERE"}, null);
while (phone_cursor.moveToNext())
{
//here you can extract the inofrmation you want
phone_cursor.getString( phone_cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}
Выполните шаги следующим образом:
// Этот метод вернет курсор, который будет содержать всю информацию
private Cursor getContacts()
{
// Run query
Uri uri = ContactsContract.Contacts.CONTENT_URI;
String[] projection = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
};
String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER;
String[] selectionArgs = null;
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
return managedQuery(uri, projection, selection, selectionArgs, sortOrder);
}
Затем вы можете перебрать этот Курсор, чтобы получить имя и идентификатор следующим образом:
while (cursor.moveToNext())
{
namess[i]= cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
id[i] = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
i++;
}
Ответ vikramjb отличный, я попытался сделать это более понятным способом (используя инструкции здесь https://developer.android.com/reference/android/provider/ContactsContract.PhoneLookup.html):
private Long GetContactIdFromNumber(ContentResolver contentResolver, String number)
{
Uri contactLookup = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));
Cursor contactLookupCursor = contentResolver.query(contactLookup,new String[] {ContactsContract.PhoneLookup._ID}, null, null, null);
if (contactLookupCursor.moveToNext()){
long ret = contactLookupCursor.getLong(contactLookupCursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup._ID));
contactLookupCursor.close();
return ret;
}
contactLookupCursor.close();
return 0l;
}
Кстати, в версиях API (выше 21) есть PHONE_ACCOUNT_ID
колонка в CallLog.Calls
: https://developer.android.com/reference/android/provider/CallLog.Calls.html