2011-08-23 13 views
6

¿Hay alguna forma de obtener todos los números de teléfono para todos los contactos sin hacer una consulta por separado para cada contacto? (usando Android 2.0+). Es realmente lento si tienes más de 100 contactos (inutilizables en teléfonos de gama baja), me preguntaba si podría hacer una consulta más eficiente.Manera eficiente de cargar todos los contactos y todos los números de teléfono (Android 2.0)

Actualmente estoy obteniendo un cursor con todos los contactos válidos ContactsContract.Contacts.IN_VISIBLE_GROUP contactos y luego una consulta separada para cada contacto para obtener todos sus números.

de fragmentos desde el primer contacto solo geting nombre y la búsqueda de claves:

Uri uri = ContactsContract.Contacts.CONTENT_URI; 

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

Entonces cada contacto utilizando la clave de búsqueda.

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

que vincula a esta pregunta? – scottyab

+0

Tiene razón debe presentar el formulario dos veces. Buen lugar. Votado para cerrar. – scottyab

Respuesta

15

Comprobar si el código de abajo ayuda a

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, tiempo de carga reducido de 8.7s a 2.4s :) – scottyab

+0

después de insertar contacto nuevo en native cómo puedo obtener ID de contacto nativo – AndroidRaji

0

Por qué d utiliza?

Contract.Contacts.IN_VISIBLE_GROUP

Son todos los contactos en Android asignados a Contract.Contacts.IN_VISIBLE_GROUP

Cuestiones relacionadas