22
tüm telefon kayıtlarını ve e-posta adreslerini ve fotoğraf uri almak gerekir

:Android Kişiler sağlayıcı tüm e-postalar ile sadece telefon kayıtlarını almak

Bu yapıyorum budur:

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

Benim sorunum bütün alıyorum gmail kişileri de dahil olmak üzere kişiler, gmail kişilerin dahil edilmesini istemiyorum. Ve alınan zaman da çok yavaş. Bunu nasıl optimize edebilirim, alma zamanını biliyorum çok sayıda imleç kullanıyorum .. ama bana e-posta numarası fotoğraf uri verebilecek tek bir cüruf nasıl yapılacağını bilmiyorum ... Teşekkürler!

SON GÜNCELLEME:

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

cevap

22

Sen Data.CONTENT_URI üzerinde bir sorguda, Geliş "android.provider.ContactsContract.Data" tablosu içinde gerekli tüm bilgileri elde edebilmek ve nasıl örnekler gerekir Örneğin http://developer.android.com/reference/android/provider/ContactsContract.Data.html

... veri Email, Telefon, Fotoğraf vb farklı türde sorgulamak için:

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

Size belirli bir kişi ile ilgili gereken tüm bilgileri getirmeli, teorik olarak tüm kişileri sorabilir ve bilgileri kendiniz belirleyebilirsiniz.

bu daha karmaşık bir konudur gmail kişileri filtreleme gelince, ACCOUNT_NAME/TÜRÜ bakmak http://developer.android.com/reference/android/provider/ContactsContract.RawContacts.html parametre ve burada bu konu ile ilgili bir tartışma: What is the default Account Type/Name for contacts on Android Contact Application?

+0

nasıl yukarıdaki sorgu tarafından görünen adı alma hakkında .. – sukarno

+0

performansını artırmak amacıyla .. bir özel sorguda bütün iletişim email numarası görünen adını ve fotoğraf uri almak gerekir – sukarno

+0

sana Veri tablosu da ContactContarct ile birleştirilir görebilirsiniz sağlanan ilk linkte .. gmail hesabına ile arama hakkında unutmak .Contacts -> Contacts.DISPLAY_NAME için sorabilirsiniz. Veri tablosunu çok sayıda kayıt içerdiğinden, "doğru" olana baktığınızdan emin olmanız gerekir. Şimdilik üç kişileri alıyorum nerede .. Jaffa'lar bir telefon numarası ve posta kimliği vardır: – Raanan