Busque contactos usando el nombre así como la empresa (como en la aplicación predeterminada de contactos de Android 2.3.3)

He desarrollado una simple aplicación de contactos y también la búsqueda mediante el uso de nombre. Pero ahora quiero buscar utilizando tanto el nombre y la empresa (al igual que la forma predeterminada de la aplicación de contactos de Android). Puedo buscar por separado usando la compañía pero no pude conseguir otra información de contacto porque el identificador del contacto volvió es diferente … He pegado mi código abajo.

Código para obtener los contactos mediante la búsqueda de nombres: (la cadena de búsqueda se obtiene de edittext utilizando listener textchanged)

private Cursor getContactsByName(String temp) { Uri uri = ContactsContract.Contacts.CONTENT_URI; String[] projection = new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, }; String selection = ContactsContract.Contacts.DISPLAY_NAME + " like '" + temp + "%'"; String[] selectionArgs = null; String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; return managedQuery(uri, projection, selection, selectionArgs, sortOrder); } 

Código para obtener contactos usando la búsqueda de la empresa: (la cadena de búsqueda se obtiene de edittext usando el listener textchanged)

  private Cursor getContactsByCompany(String temp) { Uri uri = ContactsContract.Data.CONTENT_URI; String[] proj = new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, Organization.COMPANY}; String selection3 = Data.MIMETYPE + "='" + Organization.CONTENT_ITEM_TYPE + "' AND " + Organization.COMPANY + " like '" + temp + "%'"; String[] selectionArgs = null; String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; return managedQuery(uri, proj, selection3, selectionArgs, sortOrder); } 

En el primer caso (es decir, búsqueda de nombre), estoy recibiendo un cursor con información como id de contacto, nombre. Usando la identificación del contacto, exhibo la información del contacto como la foto, email en la página del contacto de la visión.

En el segundo caso (es decir, búsqueda de empresa), obtengo un cursor con información de contacto id, nombre y empresa. Pero aquí el identificador de contacto devuelto para los mismos contactos es diferente del que devolvió en el primer caso. Así que no puedo obtener otra información del contacto como foto, correo electrónico etc utilizando este identificador de contacto.

Si el identificador de contacto de un contacto es el mismo en el caso 1 y en el caso 2, puedo integrar las dos búsquedas en una eliminando los duplicados. Pero este no es el caso aquí.

Así que mi pregunta es ¿cómo puedo encontrar información de contacto del segundo caso si el contacto id es diferente y cómo puedo combinar las dos búsquedas?

Por fin he encontrado la solución.

El problema fue con el identificador de contacto devuelto.

Así que en el primer caso ( que es buscar por nombre ), tenemos que tomar ContactsContract.Contacts._ID como el id del contacto.

Y en el segundo caso ( que es la búsqueda por empresa ), ya que el Uri es diferente (en este caso es ContactsContract.Data.CONTENT_URI) y también los criterios de selección Data.MIMETYPE es Organization.CONTENT_ITEM_TYPE, tenemos que usar Organization.CONTACT_ID

Del mismo modo, cuando se realiza una búsqueda mediante correo electrónico, debe utilizar ContactsContract.CommonDataKinds.Email.CONTACT_ID como ID de contacto. Del mismo modo para otros campos.

Usando estos identificadores de contacto podemos combinar la búsqueda por nombre y compañía. Podemos eliminar duplicados en los identificadores de contacto utilizando el concepto Set .

Utilice esta función para combinar la búsqueda .. puede ayudarle ..

 private Cursor getContactsByCompanyORname(String temp) { Uri uri = ContactsContract.Data.CONTENT_URI; String[] proj = new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, Organization.COMPANY}; String selection3 = Data.MIMETYPE + "='" + Organization.CONTENT_ITEM_TYPE + "' AND " + Organization.COMPANY + " like '" + temp + "%'" + "' OR '" ContactsContract.Contacts.DISPLAY_NAME + " like '" + temp + "%'"; String[] selectionArgs = null; String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; return managedQuery(uri, proj, selection3, selectionArgs, sortOrder); } 

Así que cambia String selection3

¡Esto tomó mucho tiempo y mucha frustración! Lo siguiente hace una búsqueda por nombre de contacto, compañía y título:

 /** * Creates the Loader used to load contact data filtered by the * given Query String. */ private Loader<Cursor> createLoaderFiltered(String theQueryString) { final String[] COLS = new String[] {"contact_id", ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME}; final String LIKE = " LIKE '%" + theQueryString + "%'"; final Uri URI = ContactsContract.Data.CONTENT_URI; final String ORANIZATION_MIME = Organization.CONTENT_ITEM_TYPE; final String NAME_MIME = StructuredName.CONTENT_ITEM_TYPE; final String WHERE = "(" + Data.MIMETYPE + "='" + ORANIZATION_MIME + "'" + " AND (" + Organization.COMPANY + LIKE + " OR " + Organization.TITLE + LIKE + ")" + " AND " + ContactsContract.Contacts.DISPLAY_NAME + " NOT " + LIKE + ") OR (" + Data.MIMETYPE + "='" + NAME_MIME + "'" + " AND " + ContactsContract.Contacts.DISPLAY_NAME + LIKE + ")"; final String SORT = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; return new CursorLoader(getActivity(), URI, COLS, WHERE, null, SORT); } 

La cláusula "ContactsContract.Contacts.DISPLAY_NAME NOT LIKE" es necesaria para eliminar las filas duplicadas de contactos que coinciden tanto en el nombre del contacto como en la empresa / título.

  • ¿Cómo puedo recuperar eventos de contacto sincronizados desde Contactos de Google sin un año?
  • Actualización / Configuración de la imagen del perfil de usuario propio
  • Android Contacts.CONTENT_STREQUENT_URI lanza SQLiteException en Android 4.1.2 y 4.4.2
  • ¿Diferencia entre términos android?
  • Consulta de contacto Android para obtener ACCOUNT_TYPE y ACCOUNT_NAME
  • Recuperar número de teléfono de contacto de URI en Android
  • ¿Cómo puedo cargar una foto de contacto?
  • Insertar contactos Apellido utilizando Intent android
  • Cómo obtener todos los contactos nombre, apellido, correo electrónico, número de teléfono, etc, sin duplicados
  • Obtener contactos de Android con funcionalidad de tipo a filtro, restringida a una cuenta específica
  • Android 3.0 - Cómo recuperar todos los contactos a través de ContactsContract
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.