22

мне нужно, чтобы получить все контакты телефона и адрес электронной почты и фото URI:Android Контакты поставщика получить только телефонные контакты со всеми писем

Это то, что я делаю:

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

Моя проблема я получаю все контакты, включая контакты gmail, я не хочу, чтобы контакты gmail были включены. И время, проведенное, также очень медленное. Как я оптимизирую это, я знаю, что он занимает время, потому что я использую много курсоров .. но не знаю, как сделать один cusror, который может дать мне имя по электронной почте номер фото uri ... Спасибо!

ОБНОВЛЕНО FINAL:

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

ответ

22

Вы должны быть в состоянии получить всю необходимую информацию в одном запросе на Data.CONTENT_URI, Отъезд «android.provider.ContactsContract.Data» таблицы и примеры того, как запрашивать различные типы данных электронной почты, телефон, фото и т.д. ... http://developer.android.com/reference/android/provider/ContactsContract.Data.html

Например:

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

Должна предоставить вам всю необходимую информацию об одном конкретном контакте, вы могли бы теоретически запросить все контакты и отсортировать информацию самостоятельно.

Что касается фильтрации GMAIL контактов это более сложный вопрос, посмотрите на ACCOUNT_NAME/TYPE http://developer.android.com/reference/android/provider/ContactsContract.RawContacts.html параметра и обсуждение по этому вопросу здесь: What is the default Account Type/Name for contacts on Android Contact Application?

+0

как о получении отображаемого названия выше запрос .. – sukarno

+0

забыть про фильтрацию с помощью учетной записи gmail .. нужно получить все контактные данные с указанием имени и фотографии адресов электронной почты в одном пользовательском запросе .. чтобы повысить производительность – sukarno

+0

В первой ссылке, которую я предоставил, вы можете видеть, что таблица данных также объединена с ContactContarct .Контакты ->, чтобы вы могли запросить контакты.DISPLAY_NAME. Учитывайте, что таблица данных содержит много записей, поэтому вам нужно убедиться, что вы смотрите на «правильный». – Raanan

Смежные вопросы