2010-02-01 10 views
16

Estoy tratando de obtener el nombre del remitente de la base de datos de contactos usando un proveedor de contenido.¿Cómo buscar el nombre de un contacto desde su número de teléfono en Android?

El problema es que no sé cómo implementarlo. Al igual que ahora, solo puedo extraer el número de teléfono del smsMessage. Necesito verificar si el número de teléfono que está llamando está en primer lugar en los contactos de los usuarios y si aparece el nombre si no es así, mostrar el número.

+3

Probablemente puede generalizar esta pregunta a algo así como '¿Cómo buscar un contacto dado una cadena de número de teléfono sin formato, sin procesar? ' –

Respuesta

24

Sí, esto es posible usando ContactsContract.PhoneLookup.CONTENT_FILTER_URI en Android 2.0 y superior y Contacts.Phones.CONTENT_FILTER_URL en Android 1.6 y versiones anteriores.

Por ejemplo de uso, consulte la documentación para ContactsContract.PhoneLookup. Extracto a continuación:

// Android 1.6 and earlier (backwards compatible for Android 2.0+) 
Uri uri = Uri.withAppendedPath(Contacts.Phones.CONTENT_FILTER_URL, Uri.encode(phoneNumber)); 

// Android 2.0 and later 
Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); 

// Query the filter URI 
String[] projection = new String[]{ PhoneLookup.DISPLAY_NAME, ... 
Cursor cursor = context.getContentResolver().query(uri, projection, ... 

ACTUALIZACIÓN: El formato del número de teléfono, no importa. La comparación es robusta y altamente optimizada en Android; se hace usando una función sqlite nativa llamada PHONE_NUMBERS_EQUAL. Para más detalles, search the codebase for this method. Por cierto, no estoy seguro si es seguro usar esa función directamente en tus propias aplicaciones, pero no lo haría.

+2

¿Qué incluye específicamente el resto de esa consulta? Esta respuesta no es mucho más útil que la documentación existente. – eternalmatt

+4

¿Importa el formato del número de teléfono? Es decir, '(555) 555-5555' y' 555-555-5555' coincidirán con '555555555'? –

+0

¿Importa el formato del número de teléfono? Es decir, ¿(555) 555-5555 y 555-555-5555 coincidirán 555555555? [2] –

19

Aquí es lo que hice

ContentResolver localContentResolver = this.mContext.getContentResolver(); 
Cursor contactLookupCursor = 
    localContentResolver.query(
      Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, 
      Uri.encode(phoneNumber)), 
      new String[] {PhoneLookup.DISPLAY_NAME, PhoneLookup._ID}, 
      null, 
      null, 
      null); 
try { 
while(contactLookupCursor.moveToNext()){ 
    String contactName = contactLookupCursor.getString(contactLookupCursor.getColumnIndexOrThrow(PhoneLookup.DISPLAY_NAME)); 
    String contactId = contactLookupCursor.getString(contactLookupCursor.getColumnIndexOrThrow(PhoneLookup._ID)); 
    Log.d(LOGTAG, "contactMatch name: " + contactName); 
    Log.d(LOGTAG, "contactMatch id: " + contactId); 
    } 
} finally { 
contactLookupCursor.close(); 
} 

Pasando en su número de teléfono que ya tiene en Uri.encode (phoneNumber)

+0

gracias me ayudó – Sando

+0

Más buenos ejemplos aquí: http://stackoverflow.com/questions/3079365/android-retrieve-contact-name-from-phone-number/8695649 – mdaddy

+0

Esto me ayudó mucho. Gracias Andrew, solo una pequeña pregunta. ¿Existe la posibilidad de cambiar este código un poco más y hacer que busque/coincida un número de teléfono con el nombre de contacto mientras escribe? Digamos que mi número es 444 886 444. Recuerdo '886', no el resto. Debe buscar y combinar y 'Dar' algunos resultados. Si está dispuesto a responder mi comentario, sería muy apreciado. Si alguien tiene un enlace para este tipo de cosas, por favor publíquelo. ¡Gracias por adelantado! – Paramone

Cuestiones relacionadas