2010-06-15 13 views
33

Sto provando a chiamare il selettore di contatti, ottenere il nome di persone, il telefono e l'e-mail in stringhe e inviarli a un'altra attività utilizzando un intento. Finora questo funziona:ottenere informazioni di contatto dal selettore di contatti Android

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

Ma se aggiungo in:

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

si chiude vigore

Forse ce n'è un altro modo per ottenere il loro numero?

risposta

61

numeri di telefono

I numeri di telefono sono memorizzati nel proprio tavolo e hanno bisogno di essere interrogato separatamente. Per eseguire una query sulla tabella dei numeri di telefono, utilizzare l'URI memorizzato nella variabile SDK ContactsContract.CommonDataKinds.Phone.CONTENT_URI. Utilizzare un WHERE condizionale per ottenere i numeri di telefono per il contatto specificato.

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

Eseguire una seconda query sul database SQLite dei contatti Android. I numeri di telefono vengono interrogati sull'URI memorizzato in ContactsContract.CommonDataKinds.Phone.CONTENT_URI. L'ID del contatto viene memorizzato nella tabella del telefono come ContactsContract.CommonDataKinds.Phone.CONTACT_ID e la clausola WHERE viene utilizzata per limitare i dati restituiti.

indirizzi e-mail

Interrogazione di indirizzi di posta elettronica è simile a numeri di telefono. È necessario eseguire una query per ottenere indirizzi email dal database. Interroga l'URI memorizzato in ContactsContract.CommonDataKinds.Email.CONTENT_URI per interrogare la tabella degli indirizzi e-mail.

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

Come con la query telefono i nomi dei campi della tabella di posta elettronica vengono memorizzati anche sotto ContactsContract.CommonDataKinds. La query di posta elettronica viene eseguita sull'URI in ContactsContract.CommonDataKinds.Email.CONTENT_URI e la clausola WHERE deve corrispondere al campo ContactsContract.CommonDataKinds.Email.CONTACT_ID. Dal momento che più indirizzi e-mail possono essere memorizzati in loop attraverso i record restituiti nel Cursore.

Altri tutorial here

Questo metodo richiede la versione API di Android 5 o superiore.

+0

grandi opere e il sito web si è collegato al bene molto volentieri vieni utile, grazie – ng93

+1

Come faccio a interrogare il numero di telefono nell'ultimo ciclo while? – eyal

+7

cr.query non sembra funzionare.Inoltre, cosa è id in String [] {id} ... non riesco a trovare nessuna di queste variabili. –

1

Costruire sulla risposta accettata, se si desidera passare direttamente all'indirizzo di posta elettronica desiderato e non richiede l'uso di contatti permessi o meno così:

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

Questo non richiede il permesso contatti per leggere il indirizzo email come i metodi di doppia interrogazione sopra. Inoltre, non richiede all'utente di scrivere un'interfaccia utente per consentire all'utente di selezionare l'indirizzo email appropriato per i contatti con più e-mail, l'utente seleziona un'e-mail specifica nell'app Contatti in modo da ottenere solo un risultato.

Il cursore torna con un bel paio di colonne, oltre all'indirizzo di posta elettronica, proprio come il nome visualizzato, anche se questo è stato verificato solo su un Nexus 5 con sistema operativo Android M.