2010-06-15 9 views
33

Próbuję zadzwonić do selektora kontaktów, uzyskać nazwę osoby, telefon i e-mail w ciągi i wysłać je do innej działalności za pomocą intencji. Do tej pory to działa:uzyskać informacje kontaktowe z wybieraka kontaktu z Androidem

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

Ale jeśli mogę dodać:

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

życie zamyka

Może tam kolejny sposób, aby ich liczbę?

Odpowiedz

61

numery telefonów

Numery telefonów są przechowywane we własnym stole i muszą być sprawdzony oddzielnie. Aby przesłać zapytanie do tabeli numerów telefonów, użyj identyfikatora URI zapisanego w zmiennej SDK ContactsContract.CommonDataKinds.Phone.CONTENT_URI. Użyj warunku WHERE, aby uzyskać numery telefonów dla określonego kontaktu.

Wykonaj drugie zapytanie do bazy danych kontaktów SQLite z Androidem. Numery telefonów są sprawdzane na podstawie identyfikatora URI zapisanego w pliku KontaktyContract.CommonDataKinds.Phone.CONTENT_URI. Identyfikator kontaktu jest przechowywany w tabeli telefonu, ponieważ klauzula ContactsContract.CommonDataKinds.Phone.CONTACT_ID i klauzula WHERE służy do ograniczenia zwracanych danych.

Adresy e-mail

Zapytania adresy e-mail jest podobna do numerów telefonów. Aby uzyskać adresy e-mail z bazy danych, należy wykonać zapytanie. Wyślij zapytanie do identyfikatora URI zapisanego w pliku ContactsContract.CommonDataKinds.Email.CONTENT_URI, aby wysłać zapytanie do tabeli adresów 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(); 

Podobnie jak w przypadku zapytania telefonicznego, nazwy pól dla tabeli e-mailowej są również przechowywane w obszarze KontaktyContract.CommonDataKinds. Zapytanie e-mail jest wykonywane na identyfikatorze URI w pliku ContactsContract.CommonDataKinds.Email.CONTENT_URI, a klauzula WHERE musi pasować do pola ContactsContractCommonDataKinds.Email.CONTACT_ID. Ponieważ wiele adresów e-mail może być przechowywanych w pętli poprzez rekordy zwrócone w Kursorze.

Więcej tutoriali here

Ta metoda wymaga systemu Android w wersji 5 lub wyższej api.

+0

działa świetnie i strona, którą powiązana dobrze deffo przydaje się, dzięki – ng93

+1

Jak mogę zapytać numer telefonu w ostatniej pętli while? – eyal

+7

cr.query wydaje się nie działać.Co więcej, id w String [] {id} ... nie może znaleźć żadnej z tych zmiennych. –

1

Opierając się na przyjętej odpowiedź, jeśli chcesz, aby przejść bezpośrednio do żądanego adresu e-mail i nie wymagają użycia pozwolenie kontakty coś takiego:

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

ta nie wymaga zgody kontaktów przeczytać adres e-mail, taki jak metody podwójnego zapytania powyżej. Powoduje to również, że nie trzeba pisać interfejsu użytkownika, aby wybrać odpowiedni adres e-mail dla kontaktów z wieloma wiadomościami e-mail, użytkownik wybiera konkretny adres e-mail w aplikacji Kontakty, aby uzyskać tylko jeden wynik.

Kursor wraca z dość kilka kolumn oprócz tylko adres e-mail, takich jak nazwa wyświetlana, mimo że tylko został zweryfikowany na Nexusie 5 z systemem Android M.

Powiązane problemy