2010-08-17 12 views
15

Je fais un BroadcastReceiver pour recevoir le numéro de téléphone de la personne qui me appellentAndroid: Vérifiez le numéro de téléphone présent dans la liste de contacts? (Numéro de téléphone récupérer de l'appel téléphonique)

<intent-filter> 
<action 
    android:name="android.intent.action.PHONE_STATE" /> 
</intent-filter> 
  1. Comment vérifier si le numéro de téléphone recevoir est sur ma liste de contacts?
    Avez-vous un conseil pour savoir si ce numéro de téléphone existe sur la liste de contacts avec la liste de contacts de chargement?
    Je ne veux pas plus d'informations, juste si ce numéro de téléphone existe.

  2. Si ce n'est pas possible, et je dois charger la liste de contacts, comment le faire sur BroadcastReceiver?
    Lorsque je tente de faire getContentResolver, cela ne fonctionne pas parce que je suis sur BroadcastReceiver et pas à l'intérieur Activity ...

Merci pour votre aide

Répondre

31
public boolean contactExists(Context context, String number) { 
/// number is the phone number 
Uri lookupUri = Uri.withAppendedPath(
PhoneLookup.CONTENT_FILTER_URI, 
Uri.encode(number)); 
String[] mPhoneNumberProjection = { PhoneLookup._ID, PhoneLookup.NUMBER, PhoneLookup.DISPLAY_NAME }; 
Cursor cur = context.getContentResolver().query(lookupUri,mPhoneNumberProjection, null, null, null); 
try { 
    if (cur.moveToFirst()) { 
     return true; 
} 
} finally { 
if (cur != null) 
    cur.close(); 
} 
return false; 
} 
+0

Merci pour l'exemple de code :) ça marche – NicoMinsk

+0

J'ai essayé ce code, et cela fonctionne quand j'ai le "exact" nombre, mais selon le code du pays, d'autres préfixes, il ne trouve pas toujours le numéro, même quand un certain nombre existe, et appeler ce numéro appellera la même personne (numéro dans les contacts: 5556, nombre reçu: 15555215556) – Gavriel

3

pour 1, vous devriez jeter un oeil à la recommandation ContactsContract.PhoneLookup fournisseur

une table qui représente le résultat de la recherche un numéro de téléphone, par exemple pour l'identification de l'appelant. Pour effectuer une recherche, vous devez ajouter le numéro que vous voulez trouver à CONTENT_FILTER_URI. Cette requête est hautement optimisée.

Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); 
Cursor mycursor=resolver.query(uri, new String[]{PhoneLookup.DISPLAY_NAME,... 
if (mycursor!=null && mycursor.moveToFirst()) { 
// record exists 
} 

pour 2, vous pouvez utiliser la context de la méthode OnReceive pour appeler des méthodes qui appartiennent au contexte

ContentResolver cr=context.getContentResolver(); 
7

Je pense qu'il est important de dire que vous devez ajouter ce qui suit dans votre fichier manifeste.

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

Je vous suggère d'utiliser Phone.CONTENT_FILTER_URI au lieu de PhoneLookup.CONTENT_FILTER_URI parce PhoneLookup peut être vide et vous obtiendrez aucun résultat de temps en temps (testé sur LG-P500, froyo)

Le problème sur mon appareil arrive par exemple lorsque:

  1. passer en mode avion
  2. utiliser l'application de messagerie par défaut pour envoyer un sms (sera mis en attente).
  3. utilisation PhoneLookup.CONTENT_FILTER_URI à la requête pour un contact

Tous les appareils semble être affecté

En utilisant PhoneLookup.CONTENT_FILTER_URI le curseur retourné est toujours vide. En utilisant Phone.CONTENT_FILTER_URI tout va bien (vous trouvez le contact le cas échéant).

Par conséquent je vous suggère d'utiliser toujours Phone.* Uris sauf quand vous avez vraiment besoin d'utiliser PhoneLookup.* ... Ce qui est généralement juste des choses liées à la synchronisation de carnet d'adresses (et la plupart du temps n'est pas ce qui vous intéresse).