Android: récupère le nom du contact à partir du numéro de téléphone

Je voudrais 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 beaucoup mon projet.

Je pense que cela implique une requête utilisant la clause sql WHERE en tant que filtre, mais dois-je trier les contacts? Un exemple ou un indice serait d'une grande aide.

  • Impossible d'installer * .apk sur l'expiration du périphérique Lancement annulé
  • Stop OnLongClickListener lance le tir en faisant glisser
  • Will TelephonyManger.getDeviceId () renvoie l'id de périphérique pour les tableaux comme Galaxy Tab ...?
  • Comment afficher le symbole enregistré Ⓡ ou trademark ™ dans la boîte de dialogue?
  • Android studio adb Erreur de syntaxe: ")" inattendue
  • Désactivation programmable du stockage USB sur les périphériques Android
  • Comment afficher le contrôle du volume du système Android de manière programmée
  • ActionBarSherlock + Maps + Loaders = java.lang.NoClassDefFoundError
  • Android.mk vs Application.mk
  • Disposition spécifique au langage pour Android
  • Je n'ai pas de dossier brut dans Eclipse, après avoir créé un nouveau projet de fichier Android. Que puis-je faire?
  • Google Analytics interfère avec history.back () dans le navigateur Android?
  • 5 Solutions collect form web for “Android: récupère le nom du contact à partir du numéro de téléphone”

    Pour cela, vous devez utiliser le fournisseur PhoneLookup optimisé comme décrit Ajoutez l'autorisation dans le manifeste Android, c'est-à-dire READ_CONTACT

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

    Même si cela a déjà été répondu, mais voici la fonction complète pour obtenir le nom du contact du numéro. J'espère 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ée sur le commentaire de Marcus]

    Vous devrez demander cette autorisation:

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

    Cela a été très utile, voici mon dernier code pour récupérer le nom, l'identification et la photo de l'appelant:

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

    … alors, faites tout ce que vous voulez avec "input" (leur photo comme InputStream), "name" et "contactId".

    Et voici les docs qui répertorient les 15 colonnes auxquelles vous avez accès, il suffit de les ajouter à la projection près du début du code ci-dessus: http://developer.android.com/reference/android/provider/ContactsContract. PhoneLookup.html

    Cette version est identique à 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(); } 

    Passez le numéro de contact à partir duquel vous recevez l'appel dans la méthode suivante. Cette méthode vérifiera si le contact est enregistré dans votre mobile ou non. Si le contact est enregistré, il renverra le nom du contact sinon il renverra un numéro inconnu de chaîne

    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 un code source, visitez ce lien

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.