2010-02-01 4 views
16

J'essaye d'obtenir le nom de l'expéditeur de la base de données de contacts en utilisant un fournisseur de contenu.Comment rechercher le nom d'un contact à partir de son numéro de téléphone sur Android?

Le problème est que je ne sais pas comment l'implémenter. Comme maintenant, je ne peux que tirer le numéro de téléphone du smsMessage. J'ai besoin de vérifier pour voir si le numéro de téléphone qui appelle est dans les contacts des utilisateurs d'abord et si c'est afficher le nom si ce n'est pas alors afficher le numéro.

+3

Vous pouvez probablement généraliser cette question à quelque chose comme « Comment regardez-vous un contact donné une chaîne de numéro de téléphone brute, non formatée? –

Répondre

24

Oui, cela est possible en utilisant ContactsContract.PhoneLookup.CONTENT_FILTER_URI dans Android 2.0 et supérieur et Contacts.Phones.CONTENT_FILTER_URL dans Android 1.6 et versions antérieures. Par exemple, voir la documentation pour ContactsContract.PhoneLookup. Extrait ci-dessous:

// 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, ... 

MISE À JOUR: Le format du numéro de téléphone n'a pas d'importance. La comparaison est robuste et hautement optimisée sur Android; c'est fait en utilisant une fonction native sqlite nommée PHONE_NUMBERS_EQUAL. Pour plus de détails, search the codebase for this method. En passant, je ne suis pas certain que l'utilisation de cette fonction soit directement sécurisée dans vos propres applications, mais je ne le ferais pas.

+2

Qu'est-ce qui va spécifiquement dans le reste de cette requête? Cette réponse n'est pas beaucoup plus utile que la documentation existante. – eternalmatt

+4

Le format du numéro de téléphone est-il important? Autrement dit, est-ce que '(555) 555-5555' et' 555-555-5555' correspondront '555555555'? –

+0

Le format du numéro de téléphone est-il important? Autrement dit, volonté (555) 555-5555 et 555-555-5555 les deux match 555555555? [2] –

19

est ici ce que je faisais

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

En passant votre numéro de téléphone que vous avez déjà en Uri.encode (phoneNumber)

+0

merci cela m'a aidé – Sando

+0

Plus de bons exemples ici: http://stackoverflow.com/questions/3079365/android-retrieve-contact-name-from-phone-number/8695649 – mdaddy

+0

Cela m'a beaucoup aidé. Merci Andrew, Juste une petite question. Est-il possible de changer un peu plus ce code, et de le faire rechercher/faire correspondre un numéro de téléphone avec le nom du contact que vous tapez? Disons que mon numéro est 444 886 444. Je me souviens de "886", pas le reste. Il devrait chercher et correspondre et «Donnez-moi» quelques résultats. Si vous êtes prêt à répondre à mon commentaire, ce serait très apprécié. Si quelqu'un a un lien pour ce genre de chose, s'il vous plaît poster. Merci d'avance! – Paramone

Questions connexes