web-dev-qa-db-fra.com

obtenir les coordonnées de Android sélecteur de contacts

J'essaie d'appeler le sélecteur de contacts, d'obtenir le nom, le téléphone et le courrier électronique des personnes dans des chaînes et de les envoyer à une autre activité en utilisant une intention. Jusqu'à présent, cela fonctionne:

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);  
startActivityForResult(intent, 1);  

// ...

@Override  
public void onActivityResult(int reqCode, int resultCode, Intent data) {  
    super.onActivityResult(reqCode, resultCode, data);  
    if (resultCode == Activity.RESULT_OK) {  
        Uri contactData = data.getData();  
        Cursor c =  managedQuery(contactData, null, null, null, null);  
        if (c.moveToFirst()) {  
            String name = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));  
            Intent intent = new Intent(CurrentActivity.this, NewActivity.class);  
            intent.putExtra("name", name);  
            startActivityForResult(intent, 0);  
        }  
    }  
}

Mais si j'ajoute:

String number = c.getString(c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

il force se ferme

Peut-être y a-t-il une autre façon d'obtenir leur numéro?

36
ng93

Numéros de téléphone

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é dans la variable SDK ContactsContract.CommonDataKinds.Phone.CONTENT_URI. Utilisez une condition 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();
    }

Exécutez une seconde requête sur la base de données SQLite Android contacts. Les numéros de téléphone sont interrogés par rapport à l'URI stocké dans ContactsContract.CommonDataKinds.Phone.CONTENT_URI. L'ID du 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.

Adresses e-mail

La recherche d'adresses e-mail est similaire aux numéros de téléphone. Une requête doit être effectuée pour obtenir les adresses e-mail de la base de données. Recherchez l'URI stocké dans ContactsContract.CommonDataKinds.Email.CONTENT_URI pour interroger la table d'adresses électroniques.

Cursor emailCur = cr.query( 
        ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
        null,
        ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", 
        new String[]{id}, null); 
    while (emailCur.moveToNext()) { 
        // This would allow you get several email addresses
            // if the email addresses were stored in an array
        String email = emailCur.getString(
                      emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
        String emailType = emailCur.getString(
                      emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)); 
    } 
    emailCur.close();

Comme pour la requête téléphonique, les noms de champ pour la table de messagerie sont également stockés sous ContactsContract.CommonDataKinds. La requête de messagerie est effectuée sur l'URI dans ContactsContract.CommonDataKinds.Email.CONTENT_URI et la clause WHERE doit correspondre au champ ContactsContract.CommonDataKinds.Email.CONTACT_ID. Étant donné que plusieurs adresses e-mail peuvent être stockées en boucle dans les enregistrements renvoyés dans le curseur.

Plus de tutoriels ici

Cette méthode nécessite Android API version 5 ou supérieure.

62
Pentium10

En vous basant sur la réponse acceptée, si vous souhaitez accéder directement à l'adresse e-mail souhaitée et ne pas exiger l'autorisation des contacts, utilisez quelque chose comme ceci:

private static final int REQUEST_CODE_EMAIL = 1;

void startSelectingEmail() {
    Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Email.CONTENT_URI);
    startActivityForResult(intent, REQUEST_CODE_EMAIL);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CODE_EMAIL) {
        Uri emailUri = data.getData();
        Cursor emailCursor = getContext().getContentResolver().query(emailUri, null, null, null, null);
        if (emailCursor != null) {
            if (emailCursor.moveToFirst()) {
                String email = emailCursor.getString(
                        emailCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Email.DATA));
                String emailType = emailCursor.getString(
                        emailCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Email.TYPE));
                Log.d(TAG, "Email: " + emailType + " " + email);
            }
            emailCursor.close();
        }
    }
}

Cela ne nécessite pas l'autorisation des contacts pour lire l'adresse e-mail comme les méthodes de double requête ci-dessus. Il permet également de ne pas avoir à écrire d'interface utilisateur pour que l'utilisateur sélectionne l'adresse e-mail appropriée pour les contacts avec plusieurs e-mails, l'utilisateur sélectionne un e-mail spécifique dans l'application Contacts afin que vous n'obteniez qu'un seul résultat.

Le curseur revient avec quelques colonnes en plus de l'adresse e-mail comme le nom d'affichage, bien que cela n'ait été vérifié que sur un Nexus 5 exécutant Android M.

1
caller9