2011-08-23 14 views
6

C'è un modo per ottenere tutti i numeri di telefono per tutti i contatti senza fare una query separata per ogni contatto? (usando Android 2.0+). È molto lento se hai oltre 100 contatti (inutilizzabile sui telefoni di fascia bassa), mi chiedevo se potessi fare una query più efficiente.Modo efficiente per caricare tutti i contatti e tutti i numeri di telefono (Android 2.0)

Attualmente sto ottenendo un cursore con tutti i contatti ContactsContract.Contacts.IN_VISIBLE_GROUP validi, quindi una query separata per ogni contatto per ottenere tutti i loro numeri.

Snippet dal get Contatti solo geting nome e ricerca della chiave:

Uri uri = ContactsContract.Contacts.CONTENT_URI; 

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

Poi ogni contatto utilizzando la chiave di ricerca.

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

che si collega a questa domanda? – scottyab

+0

Hai ragione di presentare il modulo due volte. Buon posto Votato per chiudere. – scottyab

risposta

15

Verificare se il codice qui sotto aiuta

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

nice one, tempo di caricamento ridotto da 8.7s a 2.4s :) – scottyab

+0

dopo aver inserito un nuovo contatto in nativo come posso ottenere l'id del contatto nativo – AndroidRaji

0

Perché D si utilizza?

Contract.Contacts.IN_VISIBLE_GROUP

sono tutti i contatti in Android assegnati a Contract.Contacts.IN_VISIBLE_GROUP

Problemi correlati