2010-07-07 4 views
2

Mon application Android doit récupérer des informations sur un contact (à savoir, numéro de téléphone et nom.) J'ai écrit du code en utilisant getContentResolver().query() Dans les résultats, je vois que le nom est étant retourné, et d'autres informations comme quand j'ai contacté cette personne pour la dernière fois, mais pas le numéro de téléphone. Qu'est-ce que je fais mal?Impossible d'obtenir un numéro de téléphone dans mon application Android

Le code:

Log.w("MyApp", "requesting " + phonesUri.toString()); 
Cursor contactCursor = context.getContentResolver().query(person, null, null, null, null); 
contactCursor.moveToFirst(); 

for (int i = 0; i < contactCursor.getColumnCount(); i ++) { 
    Log.w("MyApp", contactCursor.getColumnName(i) + ": " + contactCursor.getString(i)); 
} 

qui sort ceci:

W/MyApp (21477): requesting content://contacts/people/169/phones 
W/MyApp (21477): times_contacted: 6 
W/MyApp (21477): custom_ringtone: null 
W/MyApp (21477): primary_organization: null 
W/MyApp (21477): phonetic_name: 
W/MyApp (21477): status: null 
W/MyApp (21477): label: null 
W/MyApp (21477): number: null 
W/MyApp (21477): type: null 
W/MyApp (21477): mode: null 
W/MyApp (21477): last_time_contacted: 1278113641980 
W/MyApp (21477): display_name: (name removed for privacy) 
W/MyApp (21477): im_handle: null 
W/MyApp (21477): _id: 169 
W/MyApp (21477): number_key: null 
W/MyApp (21477): starred: 0 
W/MyApp (21477): primary_email: null 
W/MyApp (21477): name: (name removed for privacy) 
W/MyApp (21477): primary_phone: null 
W/MyApp (21477): im_account: null 
W/MyApp (21477): notes: 
W/MyApp (21477): im_protocol: null 
W/MyApp (21477): send_to_voicemail: 0 

Répondre

3
  1. Vous n'avez pas besoin d'écrire votre propre méthode itérer pour imprimer à l'écran/log, appelez DatabaseUtils.dumpCursorToString(cursor); sur un cursor pour obtenir une représentation String de la sortie brute.

  2. Les numéros de téléphone sont stockés dans leur propre table et doivent être interrogés séparément. Pour interroger la table des numéros de téléphone, utilisez l'URI stockée dans la variable SDK ContactsContract.CommonDataKinds.Phone.CONTENT_URI. Utilisez un conditionnel WHERE pour obtenir les numéros de téléphone du contact spécifié.

    if (Integer.parseInt(cur.getString(
          cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
         Cursor pCur = cr.query(
        ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
        null, 
        ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
        new String[]{id}, null); 
        while (pCur.moveToNext()) { 
        // Do something with phones 
        } 
        pCur.close(); 
    } 
    

Effectuer une deuxième requête sur la base de données de contacts Applications SQLite. Les numéros de téléphone sont interrogés par rapport à l'URI stockée dans ContactsContract.CommonDataKinds.Phone.CONTENT_URI. L'ID de contact est stocké dans la table téléphonique en tant que ContactsContract.CommonDataKinds.Phone.CONTACT_ID et la clause WHERE est utilisée pour limiter les données renvoyées.

Consultez ce tutoriel Working With Android Contacts

+0

Merci. Il semble que les vieux trucs pré-Eclair ne fonctionnent plus de manière fiable. Une fois que je suis passé à ContactsContract, les choses ont commencé à fonctionner. –

Questions connexes