2010-09-14 29 views
26

En mi aplicación, el usuario escribe un número de teléfono, y quiero encontrar el nombre del contacto con ese número de teléfono?Buscar contacto por número de teléfono

que suelo buscar en los contactos como éste:

Cursor cur = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, 
      null, null, null, null); 

Pero hago esto para tener acceso a todos los contactos ... En esta aplicación sólo quiero obtener el nombre del contacto del número de teléfono dado ... ¿Cómo ¿Puedo restringir la consulta?

¿O tengo que ir a través de todos los contactos y ver si alguno tiene el número de teléfono dado? Pero yo creo que esto puede ser muy lenta esta manera ...

+0

leer la documentación acerca de lo que todos esos valores nulos pueden ser sustituidos por –

+0

:) Además, desea usar 'CONTENT_FILTER_URI'. –

+0

Para la comodidad de otros, he escrito una publicación que contiene todo el código para consultar el nombre, la foto, la identificación de contacto, etc. con una explicación decente. El código contiene fragmentos que se encuentran en diferentes respuestas, pero más organizados y probados. Espero eso ayude. Enlace: http://hellafun.weebly.com/home/get-information-of-a-contact-from-number – Usman

Respuesta

32

usted debe tener una mirada a la recomendada ContactsContract.PhoneLookup proveedor de

Una tabla que representa el resultado de buscar un número de teléfono, por ejemplo para la identificación de llamada . Para realizar una búsqueda, debe agregar el número que desea encontrar a CONTENT_FILTER_URI. Esta consulta está altamente optimizada.

Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); 
resolver.query(uri, new String[]{PhoneLookup.DISPLAY_NAME,... 
+0

Gracias. Intento llamar a getContentResolver() en mi receptor de difusión, pero parece que esa función no existe ... –

+3

Intente prefijar el parámetro de contexto que tiene, así que hágalo context.getContentResolver() – Pentium10

+3

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

79

Si desea que el código completo:

public String getContactDisplayNameByNumber(String number) { 
    Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)); 
    String name = "?"; 

    ContentResolver contentResolver = getContentResolver(); 
    Cursor contactLookup = contentResolver.query(uri, new String[] {BaseColumns._ID, 
      ContactsContract.PhoneLookup.DISPLAY_NAME }, null, null, null); 

    try { 
     if (contactLookup != null && contactLookup.getCount() > 0) { 
      contactLookup.moveToNext(); 
      name = contactLookup.getString(contactLookup.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)); 
      //String contactId = contactLookup.getString(contactLookup.getColumnIndex(BaseColumns._ID)); 
     } 
    } finally { 
     if (contactLookup != null) { 
      contactLookup.close(); 
     } 
    } 

    return name; 
} 
+0

Gracias! No inicializaría la variable 'name' ya que' null' es un valor de retorno apropiado cuando no hay registros. –

+4

¿Qué pasa con los casos especiales, donde el usuario ingresó un número parcial, sin embargo, los números almacenados en un formato que no coincide? Por ejemplo, en Israel, el prefijo del país es "+972", y para algunos números de teléfono celular, agrega "050", pero si se trata del número completo, se convierte en "97250" (sin el primer "0"). Entonces, si el usuario escribe "050" (para buscar todos los números de teléfono que lo tienen o al menos comenzar con él), no obtendrá ningún resultado ... –

+0

En mi caso, implementé una función para filtrar un número sin procesar y hacer todas las combinaciones posibles, y luego busco uno por uno. Lamentablemente, creo que Android no tiene una forma de simplificar esto. ¿Me equivoco? –

Cuestiones relacionadas