2010-06-20 9 views
45

Je souhaite récupérer le nom d'un contact associé à un numéro de téléphone entrant. Comme je traite le numéro entrant dans le broascastreceiver ayant une chaîne avec le nom de l'appelant entrant aiderait mon projet grandement.Android: Récupérer le nom du contact à partir du numéro de téléphone

Je pense que cela implique une requête utilisant la clause sql sql comme un filtre, mais ai-je besoin de trier les contacts? Un exemple ou un conseil serait d'une grande aide.

+0

Pour l'installation d'autres, j'ai écrit un article qui contient tout le code pour interroger le nom, la photo, l'ID de contact, etc. avec une explication décente. Le code contient des extraits trouvés sur différentes réponses, mais plus organisés et testés. Lien: http://hellafun.weebly.com/home/get-information-of-a-contact-from-number – Usman

Répondre

60

Pour cela, vous devez utiliser le fournisseur PhoneLookup optimisé comme décrit.

Ajouter l'autorisation à AndroidManifest.xml:

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

Puis:

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

Juste à côté de la page de développement, merci pour la réponse rapide. La méthode toString() dans Uri devrait convertir cette requête au nom du contact? –

+1

Non, vous ne devrez pas résoudre vous-même le curseur. Pour de l'aide, vérifiez les questions suivantes: http: // stackoverflow.com/questions/903343/cursor-get-the-field-valeur-android – Pentium10

+1

Je voudrais initialiser un curseur avec un managedQuery en utilisant l'URI, puis déplacez le curseur à la première position et obtenir les données? Une fois que je reçois le curseur à la première position, j'utilise getString? Je suppose que la première position serait juste parce que la requête est pour un nombre donc la requête ne tirera les noms que pour ce nombre? –

24

Cela a été très utile, voici mon code final pour récupérer Nom de l'appelant, id et Photo:

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

... faites juste ce que vous voulez avec "input" (leur photo comme InputStream), "na moi ", et" contactId ".

Et voici la documentation répertoriant les ~ 15 ou si les colonnes que vous avez accès, il suffit de les ajouter à la projection près du début du code au-dessus: http://developer.android.com/reference/android/provider/ContactsContract.PhoneLookup.html

83

Bien que cela ait déjà répondu, mais Voici la fonction complète pour obtenir le nom du contact du numéro. Espérons que cela aidera les autres:

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

[Mise à jour basé sur le commentaire de Marcus]

Vous devrez demander cette autorisation:

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

+0

il rend l'application "pas responsable" lors de la reprise de l'activité. Comment puis-je faire cela – myatmins

+0

Je reçois également ANR chaque fois que je cours sur Android 5.1 –

+0

Probablement pour l'ANR, vous devez l'exécuter sur un thread autre que le fil de l'interface utilisateur. – Marc

2

Cette version est la même que La réponse de Vikram.exe avec le code pour éviter l'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

Transmettez le numéro de contact à partir duquel vous recevez l'appel de la manière suivante. Cette méthode va vérifier si le contact est enregistré sur votre mobile ou non. Si le contact est enregistré puis il retournera le nom du contact sinon il renvoie une chaîne nombre inconnu

Ajoutez ce code dans votre classe de récepteur de diffusion

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

pour obtenir le code source, visitez la this link