Получение контактного ID из базы данных контактов 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», а A имеет два числа. По сути, идентификатор контакта для 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)); } 

Я не уверен, что я делаю что-то не так. Любая помощь будет оценена по достоинству.

 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; } в 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; } 

Код, который работает сейчас.

Хорошо .. Простите, я пропустил интерпретированный ваш вопрос, я этого не сделал. Но я думаю, что код follwing может работать. Попробуйте и дайте понять:

 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; } 

BTW, в версиях api (выше 21) есть столбец CallLog.Calls в CallLog.Calls : https://developer.android.com/reference/android/provider/CallLog.Calls.html

Intereting Posts
Как добавить onclicklistener в динамически сгенерированное текстовое представление? Android – Как получить приложение для приложения Flavor Android-компоненты для отображения графика (узлы и ребра, в 2D)? Недопустимый хэш ключа с Android Android SDK Как отображать несколько строк текста с прокруткой в ​​android? Как отобразить индикаторный пузырь поверх изображения? Наложение псевдоним Android WebView Интеграция вольер с Android Studio: не удалось найти com.aviary.android.feather.sdk: aviary-sdk: 3.4.3.350 Язык программирования для TTS программно? JellyBean Webview будет автоматически фокусировать html-элемент с подсветкой при навигации с помощью клавиатуры и не может отключить его Добавить текстовые поля в представление в Android Как обращаться с SecurityException, отброшенным из startActivity с помощью выбора? Как добавить изображение в spinner в Android Как вы имитируете и тестируете Обновление приложения на Android и iphone? Android: как очистить кэш приложений и сохранить данные пользователя через adb?