Android: получение имени контакта с номера телефона

Я хотел бы получить имя контакта, связанного с входящим номером телефона. Когда я обрабатываю входящий номер в команде broascastreceiver с строкой с именем входящего звонящего, я бы очень сильно помог моему проекту.

Я бы подумал, что это связано с запросом, использующим предложение sql WHERE в качестве фильтра, но мне нужно сортировать контакты? Примером или подсказкой была бы большая помощь.

Solutions Collecting From Web of "Android: получение имени контакта с номера телефона"

Для этого вам нужно использовать оптимизированного провайдера PhoneLookup, как описано. Добавить разрешение в манифест Android, т.е. READ_CONTACT

public String getContactName(final String phoneNumber,Context context) { Uri uri=Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI,Uri.encode(phoneNumber)); String[] projection = new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}; String contactName=""; Cursor cursor=context.getContentResolver().query(uri,projection,null,null,null); if (cursor != null) { if(cursor.moveToFirst()) { contactName=cursor.getString(0); } cursor.close(); } return contactName; } 

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

 public static String getContactName(Context context, String phoneNumber) { ContentResolver cr = context.getContentResolver(); Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); Cursor cursor = cr.query(uri, new String[]{PhoneLookup.DISPLAY_NAME}, null, null, null); if (cursor == null) { return null; } String contactName = null; if(cursor.moveToFirst()) { contactName = cursor.getString(cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME)); } if(cursor != null && !cursor.isClosed()) { cursor.close(); } return contactName; } 

[ Обновление на основе комментария Маркуса]

Вы должны будете попросить разрешения:

<uses-permission android:name="android.permission.READ_CONTACTS"/>

Это было очень полезно, вот мой окончательный код для извлечения имени вызывающего, id и фотографии:

 private void uploadContactPhoto(Context context, String number) { Log.v("ffnet", "Started uploadcontactphoto..."); String name = null; String contactId = null; InputStream input = null; // define the columns I want the query to return String[] projection = new String[] { ContactsContract.PhoneLookup.DISPLAY_NAME, ContactsContract.PhoneLookup._ID}; // encode the phone number and build the filter URI Uri contactUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)); // query time Cursor cursor = context.getContentResolver().query(contactUri, projection, null, null, null); if (cursor.moveToFirst()) { // Get values from contacts database: contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup._ID)); name = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME)); // Get photo of contactId as input stream: Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(contactId)); input = ContactsContract.Contacts.openContactPhotoInputStream(context.getContentResolver(), uri); Log.v("ffnet", "Started uploadcontactphoto: Contact Found @ " + number); Log.v("ffnet", "Started uploadcontactphoto: Contact name = " + name); Log.v("ffnet", "Started uploadcontactphoto: Contact id = " + contactId); } else { Log.v("ffnet", "Started uploadcontactphoto: Contact Not Found @ " + number); return; // contact not found } // Only continue if we found a valid contact photo: if (input == null) { Log.v("ffnet", "Started uploadcontactphoto: No photo found, id = " + contactId + " name = " + name); return; // no photo } else { this.type = contactId; Log.v("ffnet", "Started uploadcontactphoto: Photo found, id = " + contactId + " name = " + name); } 

… тогда просто делайте все, что хотите, с помощью «ввода» (их фото как InputStream), «name» и «contactId».

И вот документы, в которых перечислены 15 или около того столбцов, к которым у вас есть доступ, просто добавьте их в проекцию в начале кода выше: http://developer.android.com/reference/android/provider/ContactsContract. PhoneLookup.html

Эта версия совпадает с ответом Vikram.exe с кодом, чтобы избежать ANR

 interface GetContactNameListener { void contactName(String name); } public void getContactName(final String phoneNumber,final GetContactNameListener listener) { new Thread(new Runnable() { @Override public void run() { ContentResolver cr = getContentResolver(); Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); Cursor cursor = cr.query(uri, new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null); if (cursor == null) { return; } String contactName = null; if(cursor.moveToFirst()) { contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME)); } if(cursor != null && !cursor.isClosed()) { cursor.close(); } listener.contactName(contactName); } }).start(); } 

Передайте номер контакта, с которого вы получаете вызов, следующим способом. Этот метод проверяет, сохраняется ли контакт на вашем мобильном телефоне или нет. Если контакт сохранен, он вернет имя контакта, иначе оно вернет строку неизвестного номера

Добавьте этот код в свой широковещательный приемник класса

  public String getContactDisplayNameByNumber(String number,Context context) { Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)); name = "Incoming call from"; ContentResolver contentResolver = context.getContentResolver(); Cursor contactLookup = contentResolver.query(uri, null, null, null, null); try { if (contactLookup != null && contactLookup.getCount() > 0) { contactLookup.moveToNext(); name = contactLookup.getString(contactLookup.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)); // this.id = // contactLookup.getString(contactLookup.getColumnIndex(ContactsContract.Data.CONTACT_ID)); // String contactId = // contactLookup.getString(contactLookup.getColumnIndex(BaseColumns._ID)); }else{ name = "Unknown number"; } } finally { if (contactLookup != null) { contactLookup.close(); } } return name; } 

Получить исходный код этой ссылки