Récupération d'un numéro de téléphone avec ContactsContract dans Android ne fonctionne pas
J'ai écrit la fonction suivante afin de récupérer un numéro de téléphone unique qui appartient au contact avec l'id "contactID".
La fonction qui est de récupérer le numéro de téléphone:
private String getContactPhone(String contactID) {
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
String[] projection = null;
String where = ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?";
String[] selectionArgs = new String[] { contactID };
String sortOrder = null;
Cursor result = managedQuery(uri, projection, where, selectionArgs, sortOrder);
if (result.moveToFirst()) {
String phone = result.getString(result.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
if (phone == null) {
result.close();
return null;
}
result.close();
return phone;
}
result.close();
return null;
}
Comment cette fonction est appelée:
ArrayList<Contact> resultContacts = new ArrayList<Contact>();
Cursor result = null;
Uri uri = ContactsContract.Data.CONTENT_URI;
String[] projection = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Event.CONTACT_ID,
ContactsContract.CommonDataKinds.Event.START_DATE,
};
String where = ContactsContract.Data.MIMETYPE+" = ? AND "+ContactsContract.CommonDataKinds.Event.TYPE+" = "+ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY;
String[] selectionArgs = new String[] {ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE};
String sortOrder = null;
result = managedQuery(uri, projection, where, selectionArgs, sortOrder);
while (result.moveToNext()) {
Long id = result.getLong(result.getColumnIndex(ContactsContract.Contacts._ID));
String phone = getContactPhone(String.valueOf(id));
...
}
...
Malheureusement, il ne fonctionne pas. Je reçois null si j'appelle cette fonction avec la valeur que j'ai reçu de "ContactsContract.Les Contacts._ID". Pourquoi est-ce donc? Quel est le problème?
Edit: j'ai utilisé de la carte des Contacts._ID à CommonDataKinds.Téléphone.CONTACT_ID - qui n'a pas fonctionné. Mais maintenant j'ai la carte de Contacts.DISPLAY_NAME à CommonDataKinds.Téléphone.DISPLAY_NAME et il fonctionne tout à coup - étrange, n'est-ce pas? Mais je voudrais plutôt la carte de l'Id au lieu de l'affichage des noms. Donc, la question est toujours d'actualité. Cela pourrait-il être dû à différents IDs dans ces tableaux? N'est-ce pas pourquoi il y a recherche des Id?
Oui, comme je l'ai essayer d'obtenir le numéro de téléphone pour chaque contact lors de l'itération à travers le curseur résultant de la première requête. Et si j'ai eu deux contacts, cela ne fonctionnerait pas avec le nom d'affichage, soit, serait-il?
Est-il possible que vous pourriez montrer combien vous obtenez le
contactId
donc je pourrais être en mesure d'essayer ce mon auto?Bien sûr, je peux. J'ai ajouté des détails à la question ci-dessus. Je vous remercie pour vos efforts!
OriginalL'auteur caw | 2012-01-04
Vous devez vous connecter pour publier un commentaire.
Pour obtenir l'id du contact dans la première partie, vous devez utiliser:
au lieu de:
De la projection doit être:
Et puis, bien sûr, trouver la bonne ligne:
J'ai mis à jour la réponse maintenant, quand vous avez fourni plus de détails dans la question. Cela a fonctionné pour moi.
Ça fonctionne, merci beaucoup! Pourquoi est-Contacts._ID le mauvais champ? Qu'est-ce que dans ce domaine?
Avec
Contacts._ID
vous réellement obtenir laData._ID
colonne comme les deux est"_id"
. La colonne que vous voulez est"contact_id"
que vous êtes de l'extraction de données à partir de l'uriContactsContract.Data.CONTENT_URI
.OriginalL'auteur tidbeck
Vous obtenez null parce que vous avez mis votre projection à null. La projection est fondamentalement la liste des colonnes que vous souhaitez renvoyer par exemple
Habituellement, lorsque vous trouverez le contact, ils peuvent avoir une liste de numéros de téléphone, donc vous devez utiliser un autre curseur pour parcourir les numéros de téléphone, par exemple
Espère que cette aide.
Vous êtes de droite. Par défaut avec la valeur null, il renvoie toutes les colonnes.
Oui, vous avez raison. Désolé j'ai raté la valeur null. La seule chose que je peux suggérer, c'est de vérifier que le contactID est valide et debug par le biais de la méthode. Peut-être obtenir tous les contacts de la première et de vérifier si vous avez l'un avec l'contactID qui est passée.
Je n'ai vérifier si il est valide. Et l'ID semblait toujours être valide. J'ai juste eu à faire une conversion de long à la Chaîne. Mais s'il vous plaît voir mon montage dans la question, peut-être cela peut vous aider.
OriginalL'auteur John J Smith
Votre code pour getContactPhone() fonctionne très bien sur ma fin. J'ai testé par le lancement d'un sélecteur de contacts, sélection d'un contact, puis à l'aide de l'ID qui a été renvoyé et le passé que dans votre méthode.
Alors je soupçonne en effet, vous êtes de passage dans un ID non valide. Pouvez-vous poster le plein de trace de pile pour l'exception de pointeur null?
Oui, clés de recherche sont disponibles, car _IDs ne sont pas garantis de rester le même depuis les synchronisations et de contact de l'agrégation des changements.
+1 comme vous avez eu raison 🙂 Merci à vous!
OriginalL'auteur robertly