2010-06-15 2 views
33

Ich versuche, die Kontaktauswahl aufzurufen, den Namen, das Telefon und die E-Mail-Adresse der Person in Strings zu erfassen und sie mit Absicht an eine andere Aktivität zu senden. Bisher funktioniert das:Kontaktinformationen von Android-Kontaktauswahl erhalten

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

Aber wenn ich in hinzufügen:

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

es Kraft schließt

Vielleicht Theres ein anderer Weg, um ihre Zahl zu bekommen?

Antwort

61

Telefonnummern

Telefonnummern werden in ihrer eigenen Tabelle gespeichert und müssen separat abgefragt werden. Verwenden Sie zum Abfragen der Telefonnummerntabelle den URI, der in der SDK-Variablen ContactsContract.CommonDataKinds.Phone.CONTENT_URI gespeichert ist. Verwenden Sie eine WHERE-Bedingung, um die Telefonnummern für den angegebenen Kontakt abzurufen.

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

Führen Sie eine zweite Abfrage gegen die Android-Kontakte SQLite-Datenbank. Die Telefonnummern werden mit dem in ContactsContract.CommonDataKinds.Phone.CONTENT_URI gespeicherten URI abgefragt. Die Kontakt-ID wird in der Telefontabelle als ContactsContract.CommonDataKinds.Phone.CONTACT_ID gespeichert und die WHERE-Klausel wird verwendet, um die zurückgegebenen Daten einzuschränken.

E-Mail-Adressen

Adressen E-Mail-Abfrage ist ähnlich wie Telefonnummern. Eine Abfrage muss durchgeführt werden, um E-Mail-Adressen aus der Datenbank abzurufen. Fragen Sie den in ContactsContract.CommonDataKinds.Email.CONTENT_URI gespeicherten URI ab, um die E-Mail-Adresstabelle abzufragen.

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

Wie bei der Telefon-Abfrage der Feldnamen für die E-Mail-Tabelle werden auch unter ContactsContract.CommonDataKinds gespeichert. Die E-Mail-Abfrage wird für den URI in ContactsContract.CommonDataKinds.Email.CONTENT_URI ausgeführt, und die WHERE-Klausel muss dem Feld ContactsContract.CommonDataKinds.Email.CONTACT_ID entsprechen. Da mehrere E-Mail-Adressen gespeichert werden können, durchlaufen Sie die im Cursor zurückgegebenen Datensätze.

Weitere Tutorials here

Diese Methode erfordert Android API Version 5 oder höher.

+0

funktioniert super und die Website, die Sie gut deffo verbunden kommen in handy, danke – ng93

+1

Wie frage ich die Telefonnummer in der letzten While-Schleife? – eyal

+7

cr.query scheint nicht zu funktionieren.Auch was in String [] {id} ... id ist, scheint keine dieser Variablen zu finden. –

1

Aufbauend auf der akzeptierte Antwort, wenn Sie direkt auf die gewünschte E-Mail-Adresse springen und nicht die Kontakte Erlaubnis Verwendung so etwas wie dies erfordern:

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

Dies schließt die Kontakte Genehmigung erfordern die lesen E-Mail-Adresse wie die oben genannten doppelten Abfragemethoden. Außerdem müssen Sie keine Benutzeroberfläche erstellen, damit der Benutzer die entsprechende E-Mail-Adresse für Kontakte mit mehreren E-Mails auswählen kann. Der Benutzer wählt in der Kontakte-App eine bestimmte E-Mail aus, sodass Sie nur ein Ergebnis erhalten.

Der Cursor kommt zurück mit ganz wenigen Spalten neben nur E-Mail-Adresse wie Namensanzeige, obwohl das hat auf einem Nexus nur verifiziert wurde 5 mit Android M.

Verwandte Themen