2011-08-23 9 views
6

Czy istnieje sposób na uzyskanie wszystkich numerów telefonów dla wszystkich kontaktów bez osobnego zapytania dla każdego kontaktu? (używając Androida 2.0+). To naprawdę powolne, jeśli masz ponad 100 kontaktów (nieużyteczne w telefonach z niższej półki), zastanawiałem się, czy mogę zrobić bardziej wydajne zapytanie.Wydajny sposób na załadowanie wszystkich kontaktów i wszystkich numerów telefonów (Android 2.0)

Obecnie otrzymuję kursor z wszystkimi ważnymi kontaktami ContactsContract.Contacts.IN_VISIBLE_GROUP, a następnie osobne zapytanie dla każdego kontaktu, aby uzyskać wszystkie jego numery.

Fragment z get Kontakty prostu czuło nazwisko i odnośników klucz:

Uri uri = ContactsContract.Contacts.CONTENT_URI; 

String[] projection = new String[] { 
    ContactsContract.Contacts.DISPLAY_NAME, 
    ContactsContract.Contacts.LOOKUP_KEY}; 

Następnie każdy kontakt za pomocą klawisza odnośnika.

Uri lookupUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey); 
Uri res = ContactsContract.Contacts.lookupContact(contentResolver, lookupUri); 

String[] projection = new String[]{ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.HAS_PHONE_NUMBER}; 

...

Cursor phones = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, phoneProjection, selection, selectionArgs, sortOrder); 
+0

że linki na to pytanie? – scottyab

+0

Masz prawo dwukrotnie przesłać formularz. Dobre miejsce. Zagłosowano, aby zamknąć. – scottyab

Odpowiedz

15

Sprawdź, czy poniżej kod pomaga

public ArrayList<PhoneContactInfo> getAllPhoneContacts() { 
    Log.d("START","Getting all Contacts"); 
    ArrayList<PhoneContactInfo> arrContacts = new ArrayList<PhoneContactInfo>(); 
    PhoneContactInfo phoneContactInfo=null;  
    Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; 
    Cursor cursor = context.getContentResolver().query(uri, new String[] {ContactsContract.CommonDataKinds.Phone.NUMBER,ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone._ID}, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"); 
    cursor.moveToFirst(); 
    while (cursor.isAfterLast() == false) 
    { 
     String contactNumber= cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
     String contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
     int phoneContactID = cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID)); 


     phoneContactInfo = new PhoneContactInfo(); 
     phoneContactInfo.setPhoneContactID(phoneContactID);    
     phoneContactInfo.setContactName(contactName);     
     phoneContactInfo.setContactNumber(contactNumber); 
     if (phoneContactInfo != null) 
     { 
      arrContacts.add(phoneContactInfo); 
     } 
     phoneContactInfo = null; 
     cursor.moveToNext(); 
    }  
    cursor.close(); 
    cursor = null; 
    Log.d("END","Got all Contacts"); 
    return arrContacts; 
} 
+1

fajny, skrócono czas wczytywania z 8.7s do 2.4s :) – scottyab

+0

po wstawieniu nowego kontaktu do rodzimego, jak mogę uzyskać natywny kontakt – AndroidRaji

0

Dlaczego d użyć?

Contract.Contacts.IN_VISIBLE_GROUP

Czy wszystkie styki w Android przypisane Contract.Contacts.IN_VISIBLE_GROUP