22

muszę uzyskać wszystkie kontakty z pamięci telefonu i adres e-mail i Foto URI:Android Kontakt dostawca dostać tylko kontakty telefoniczne z wszystkich e-maili

to co robie:

private void getContacts() { 

     ContentResolver cr = getContentResolver(); 
     Cursor cur = cr.query(Contacts.CONTENT_URI, null, null, null, Contacts.DISPLAY_NAME); 

     if (cur.getCount() > 0) { 
      while (cur.moveToNext()) { 

       // if 
       // (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) 
       // > 0) { 

       Contact contact = new Contact(); 

       String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 

       Uri uri = getContactPhotoUri(Long.parseLong(id)); 
       // set photoUri 
       contact.setContactPhotoUri(uri); 

       // set name 
       contact.setContactName(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))); 

       // get the phone number 
       Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, 
         ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { id }, null); 
       while (pCur.moveToNext()) { 

        // set phone munber 
        contact.setContactNumber(pCur.getString(pCur 
          .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); 
        contacts.add(contact); 

       } 
       pCur.close(); 

       // get email and type 
       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 

        // set email 
        contact.setContactEmail(emailCur.getString(emailCur 
          .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA))); 

        contacts.add(contact); 

       } 
       emailCur.close(); 

      } 
     } 

     cur.close(); 
     contactAdapter = new ContactAdapter(this, R.id.contactList, contacts); 

     // } 

    } 

    public Uri getContactPhotoUri(long contactId) { 
     Uri photoUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 
     photoUri = Uri.withAppendedPath(photoUri, Contacts.Photo.CONTENT_DIRECTORY); 
     return photoUri; 
    } 

Mój problem Otrzymuję wszystko kontakty, w tym kontakty w Gmailu, nie chcę, aby kontakty w Gmailu były uwzględniane. Czas jest również bardzo powolny. Jak mogę to zoptymalizować, wiem, że jej poświęcenie czasu, bo używam wielu kursorów .. ale nie wiem, jak zrobić pojedynczy cusror, który może dać mi imię i nazwisko e-mail numer uri ... Dzięki!

AKTUALIZACJA KOŃCOWA:

private void getContacts() { 

    ContentResolver cr = getContentResolver(); 

    Cursor cur = cr.query(Data.CONTENT_URI, new String[] { Data.CONTACT_ID, Data.MIMETYPE, Email.ADDRESS, 
      Contacts.DISPLAY_NAME, Phone.NUMBER }, null, null, Contacts.DISPLAY_NAME); 

    Contact contact; 

    if (cur.getCount() > 0) { 

     while (cur.moveToNext()) { 

      String id = cur.getString(cur.getColumnIndex(Data.CONTACT_ID)); 

      String mimeType = cur.getString(cur.getColumnIndex(Data.MIMETYPE)); 

      if (allContacts.containsKey(id)) { 
       // update contact 
       contact = allContacts.get(id); 
      } else { 
       contact = new Contact(); 
       allContacts.put(id, contact); 
       // set photoUri 
       contact.setContactPhotoUri(getContactPhotoUri(Long.parseLong(id))); 
      } 

      if (mimeType.equals(StructuredName.CONTENT_ITEM_TYPE)) 
       // set name 
       contact.setContactName(cur.getString(cur.getColumnIndex(Contacts.DISPLAY_NAME))); 

      if (mimeType.equals(Phone.CONTENT_ITEM_TYPE)) 
       // set phone munber 
       contact.setContactNumber(cur.getString(cur.getColumnIndex(Phone.NUMBER))); 

      if (mimeType.equals(Email.CONTENT_ITEM_TYPE)) 
       // set email 
       contact.setContactEmail(cur.getString(cur.getColumnIndex(Email.ADDRESS))); 

     } 
    } 

    cur.close(); 
    // get contacts from hashmap 
    contacts.clear(); 
    contacts.addAll(allContacts.values()); 

    // remove null contacts 
    for (Contact _contact : contacts) { 

     if (_contact.getContactName() == null && _contact.getContactNumber() == null 
       && _contact.getContactEmail() == null) { 
      contacts.remove(_contact); 
      break; 
     } 

    } 

    contactAdapter = new ContactAdapter(this, R.id.contactList, contacts); 
    contactAdapter.notifyDataSetChanged(); 

} 

public Uri getContactPhotoUri(long contactId) { 
    Uri photoUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 
    photoUri = Uri.withAppendedPath(photoUri, Contacts.Photo.CONTENT_DIRECTORY); 
    return photoUri; 
} 

Odpowiedz

22

Powinieneś być w stanie uzyskać wszystkie potrzebne informacje w jednym zapytaniu na Data.CONTENT_URI, Odjazd „android.provider.ContactsContract.Data” tabela i przykłady, w jaki sposób kwerendy różnych typów danych, email, telefon, Zdjęcie etc ... http://developer.android.com/reference/android/provider/ContactsContract.Data.html

na przykład:

Cursor data = cntx.getContentResolver().query(Data.CONTENT_URI, new String[] {Data._ID,Data.MIMETYPE,Email.ADDRESS,Photo.PHOTO},Data.CONTACT_ID + "=?" + " AND " + "(" + Data.MIMETYPE + "='" + Photo.CONTENT_ITEM_TYPE + "' OR " + Data.MIMETYPE + "='" + Email.CONTENT_ITEM_TYPE +"')", 
         new String[] {String.valueOf(contactId)}, null); 

Powinieneś podać wszystkie potrzebne informacje dotyczące jednego konkretnego kontaktu, możesz teoretycznie poprosić o wszystkie kontakty i posortować informacje samodzielnie.

chodzi o filtrowanie kontaktów Gmail jest to bardziej złożony problem, przyjrzeć ACCOUNT_NAME/typ http://developer.android.com/reference/android/provider/ContactsContract.RawContacts.html parametr i dyskusja dotycząca tego problemu tutaj: What is the default Account Type/Name for contacts on Android Contact Application?

+0

jak o uzyskanie nazwę wyświetlaną przez wyżej zapytania .. – sukarno

+0

zapomnieć o filtrowaniu za pomocą konta Gmail. .., aby uzyskać listę wszystkich wyświetlanych adresów e-mail i nazwy zdjęć w jednym zapytaniu niestandardowym .. aby poprawić wydajność – sukarno

+0

W pierwszym podanym przeze mnie łączu widać, że tabela danych jest również połączona z ContactContarct .Contacts -> dzięki czemu możesz poprosić o Contacts.DISPLAY_NAME. Weź pod uwagę, że tabela danych zawiera wiele zapisów, więc musisz upewnić się, że patrzysz na "właściwą". – Raanan