2010-06-16 4 views
4

Je souhaite obtenir le surnom d'un contact du carnet d'adresses. Je commence avec son numéro de téléphone, l'interroger et je veux le surnom (aka alias) en conséquence.Récupérer le pseudo du contact

Cursor cur = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.NUMBER + " = " + incomingNumber, null, null); 

     if (cur.moveToFirst()) { 
      Log.e("saymyname", cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Nickname.NAME))); 
      Log.e("saymyname", cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Nickname.LABEL))); 
     } 

sortie des journaux est le incomingNumber (première Log.e()) et null (deuxième Log.e()), mais je veux obtenir le surnom du contact!

Merci Tom

Répondre

4

Pseudo se tient dans une autre table que les numéros de téléphone, vous devez interroger ContactsContract.Data.CONTENT_URI

Vérifiez ma réponse sur cette question

2

Le answer from Pentium10 était très utile! Merci!

Si quelqu'un a besoin d'un échantillon, regardez le code suivant:

public String accessContact(String incomingNumber) { 
     if (incomingNumber == null || "".equals(incomingNumber)) { 
      return "unknown"; 
     } 

     try { 
      Cursor cur = context.getContentResolver().query(Phone.CONTENT_URI, new String[] {Phone.DISPLAY_NAME, Phone.TYPE, Phone.CONTACT_ID}, Phone.NUMBER + " = " + incomingNumber, null, null); 

      int nameIndex = cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME); 
      int typeIndex = cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE); 
      int idIndex = cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID); 

      String name; 
      String type; 
      String id; 

      if (cur.moveToFirst()) { 
       name = cur.getString(nameIndex); 
       type = cur.getString(typeIndex); 
       id = cur.getString(idIndex); 
      } else { 
       return "unknown"; 
      } 

      cur = context.getContentResolver().query(ContactsContract.Data.CONTENT_URI, new String[] {ContactsContract.Data.DATA1}, ContactsContract.Data.CONTACT_ID + " = " + id, null, null); 

      int nicknameIndex = cur.getColumnIndex(ContactsContract.Data.DATA1); 
      String nickname; 

      if (cur.moveToFirst()) { 
       nickname = cur.getString(nicknameIndex); 
       if (nickname.equals(incomingNumber)) { 
        return name; 
       } 
       return nickname; 
      } else { 
       return name; 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return "unknown"; 
     } 
2

(je n'ai pas la réputation nécessaire de commenter si je dois ajouter réponse)

TomTasche's answer est trompeur et il a obtenu moi de perdre beaucoup de temps à essayer de comprendre pourquoi je ne pouvais pas obtenir le bon surnom sur un contact dont je savais qu'il en avait un.

J'ai trouvé la réponse par moi-même mais j'ai reçu la confirmation de this post que je la faisais maintenant correctement.

Fondamentalement, lorsque vous lisez la documentation ContactsContract.Data vous lisez:

Chaque ligne de la table de données est généralement utilisé pour stocker une seule pièce d'informations de contact (comme un numéro de téléphone) et ses métadonnées associées (comme s'il s'agit d'un numéro de travail ou de domicile)

Cela explique la partie ombragée du code de TomTasche:

if (nickname.equals(incomingNumber)) { 
       return name; 
      } 

Depuis faire une recherche avec juste le contact_id peut renvoyer plusieurs lignes (un pour chaque type d'information), il est pas garanti que le premier contient le surnom. Quand il y a un pseudo, il sera dans DATA1, mais le phone number se trouve aussi dans DATA1. La partie d'exemple dans la documentation de ContactsContract.Data indique clairement que les lignes doivent être sélectionnées en fonction de leur MIME_TYPE, seulement lorsque le MIME_TYPE est sélectionné, pouvons-nous commencer à comprendre le contenu de la ligne elle-même.

Une requête appropriée serait donc:

cursor = getContentResolver().query(
       ContactsContract.Data.CONTENT_URI, 
       new String[]{Nickname.NAME}, 
       ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + "= ?", 
       new String[]{contactID, Nickname.CONTENT_ITEM_TYPE}, 
       null); 

(où nick est ContactsContract.CommonDataKinds.Nickname)

je sentais que je devais dire quelque chose sur ce sujet pour empêcher d'autres personnes de gaspiller autant de temps que je ne basé sur ce seul sujet (le premier que j'ai trouvé avec mon ami Google).

+0

peut-être la base de données de contact a changé, ou je me trompais à l'époque (cette réponse est vraiment vieux).Quoi qu'il en soit, merci de poster une meilleure solution! – TomTasche

+0

Pas de problème. La connaissance est un processus progressif de toute façon, je suis donc heureux de pouvoir mettre votre réponse à jour. Merci de l'avoir posté en premier lieu: p –

Questions connexes