El proveedor de contactos de Android sólo obtiene contactos telefónicos con todos los correos electrónicos
Necesito obtener todos los contactos del teléfono y su dirección de correo electrónico y foto uri:
Esto es lo que estoy haciendo:
- Android error Dx problema de escritura salida: ya preparado
- Obtener cuenta con cursor.getCount () o para ejecutar un rawQuery con un COUNT en una cláusula SQL?
- Simula la memoria baja en el dispositivo real de Android
- Cómo reducir el tamaño de WebView dinámicamente de acuerdo a su contenido?
- Mejor manera de mostrar datos de flujo en la vista de lista de 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; }
Mi problema es conseguir todos los contactos incluyendo contactos de Gmail, no quiero que los contactos de Gmail se incluyan. Y el tiempo tomado es también muy lento. ¿Cómo puedo optimizar esto, sé que está tomando tiempo porque estoy usando muchos cursores .. pero no sé cómo hacer un solo error que puede darme nombre de correo electrónico número de fotos uri … Gracias!
ACTUALIZADO 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; }
- Múltiples montajes en un cuerpo o múltiples cuerpos?
- Cómo mejorar el rendimiento de ViewFlipper / ViewAnimator
- ¿Qué es "pools de asignación para objetos temporales"?
- Vista personalizada de Android delegado de grupo addView
- HttpUrlConnection de Android: Publicar Multipart
- StackOverflowError al cambiar la visibilidad de la vista
- ¿Por qué INSERTs y UPDATEs son más lentos en Android 4.0?
- Obtención de velocidad mediante el API de ubicación de Google Play
Usted debe ser capaz de obtener toda la información necesaria en una consulta en Data.CONTENT_URI, echa un vistazo a la tabla "android.provider.ContactsContract.Data" y los ejemplos sobre cómo consultar diferentes tipos de datos de correo electrónico, teléfono, foto, etc … http://developer.android.com/reference/android/provider/ContactsContract.Data.html
Por ejemplo:
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);
Debe traerle toda la información que necesita sobre un contactId específico, teóricamente podría pedir todos los contactos y ordenar la información usted mismo.
En cuanto al filtrado de contactos de Gmail, este es un tema más complejo, eche un vistazo al parámetro ACCOUNT_NAME / TYPE http://developer.android.com/reference/android/provider/ContactsContract.RawContacts.html y una discusión sobre este problema aquí: ¿Qué Es el tipo / nombre de cuenta predeterminado para los contactos de la aplicación de contacto de Android?
- ¿Cómo enviar notificaciones a la aplicación de Android desde el servidor de Java mediante GCM?
- ¿Cómo puedo iniciar una nueva actividad de Android con una cadena?