2010-06-20 12 views
45

Me gustaría recuperar el nombre de un contacto asociado con un número de teléfono entrante. A medida que procese el número entrante en el receptor de radiodifusión que tiene una Cadena con el nombre de la persona que llama entrante, me ayudará muchísimo.Android: Recuperar el nombre del contacto del número de teléfono

Creo que esto implica una consulta utilizando la cláusula sql WHERE como filtro, pero ¿debo ordenar los contactos? Un ejemplo o sugerencia sería de gran ayuda.

+0

Para la instalación de otros, escribí 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. Enlace: http://hellafun.weebly.com/home/get-information-of-a-contact-from-number – Usman

Respuesta

60

Para eso necesita utilizar el proveedor optimizado PhoneLookup como se describe.

agregar el permiso a AndroidManifest.xml:

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

continuación:

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

Al salir de la página de desarrollo, gracias por la respuesta rápida. El método toString() en Uri debe convertir esta consulta al nombre de los contactos? –

+1

No, no tendrá que resolver el Cursor usted mismo. Para obtener ayuda, consulte estas preguntas: http: // stackoverflow.com/questions/903343/cursor-get-the-field-value-android – Pentium10

+1

Inicializaría un cursor con una managedQuery usando el URI, luego movería el cursor a la posición de puño y obtendría los datos? Una vez que tengo el cursor en la primera posición, ¿uso getString? Supongo que la primera posición sería correcta porque la consulta es para un número, por lo tanto, la consulta extraerá nombres solo para ese número. –

24

Esto fue muy útil, aquí está mi código final para la recuperación de la persona que llama nombre, ID y Foto:

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

... luego haz lo que quieras con "entrada" (su foto como InputStream), "na me "y" contactId ".

Y aquí están los documentos se enumeran los ~ 15 o más columnas de las que tiene acceso, hay que añadirlas a la proyección cerca del inicio del código de arriba: http://developer.android.com/reference/android/provider/ContactsContract.PhoneLookup.html

83

Aunque esto ya ha sido contestada, pero aquí está la función completa para obtener el nombre del contacto del número. Esperamos que ayude a los demás:

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

[Actualización de basado en el comentario de Marcus]

Tendrá que pedir este permiso:

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

+0

hace que la aplicación "no sea responsable" al reanudar la actividad. ¿Cómo debo hacer eso? – myatmins

+0

También obtengo ANR cada vez que ejecuto Android 5.1 –

+0

Probablemente para el ANR necesite ejecutarlo en un hilo que no sea el de la interfaz de usuario. – Marc

2

Esta versión es la misma que La respuesta de Vikram.exe con el código para evitar el 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(); 

} 
1

Pase el número de contacto desde el que recibe la llamada en el siguiente método. Este método verificará si el contacto está guardado en su móvil o no. Si el contacto se guarda entonces se devolverá el nombre del contacto de lo contrario, devuelve una cadena de número desconocido

Añadir este código en tu clase Receptor de radio

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

para obtener el código fuente visita this link

Cuestiones relacionadas