Obtener contactos de Android con funcionalidad de tipo a filtro, restringida a una cuenta específica

Estoy tratando de:

  • Mostrar una lista de contactos
  • Permite al usuario buscar a través de ellos escribiendo una consulta
  • Limitar los resultados de búsqueda sólo a una cuenta de Google / Gmail específica.

Así es como construyo el URI para el cursor:

// User is searching for 'jo' String query = "jo"; Uri uri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode(query)); // Restrict the query to contacts from 'example@gmail.com' Uri.Builder builder = uri.buildUpon(); builder.appendQueryParameter( ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(ContactsContract.Directory.DEFAULT)); builder.appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_NAME, "example@gmail.com"); builder.appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_TYPE, "com.google"); uri = builder.build(); 

Este es el URI final:

 content://com.android.contacts/contacts/filter/jo?directory=0&account_name=example%40gmail.com&account_type=com.google 

En la actualidad, muestra los resultados de búsqueda de todas las cuentas en el teléfono.


NOTA: Si utilizo Contacts.CONTENT_URI lugar de Contacts.CONTENT_FILTER_URI , a continuación, especificar el directorio / cuenta funciona como se esperaba, pero ya no puedo usar la búsqueda de estilo 'tipo a filtro'.

La documentación indica:

El caso de uso más importante de los directorios es la búsqueda. Se espera que un proveedor de directorio admita al menos Contacts.CONTENT_FILTER_URI .

¿Podría alguien ayudar a señalar lo que podría estar haciendo mal?

He añadido el código en el ejemplo de Google para la recuperación de contactos y, con un par de cambios, funcionó perfectamente con mi cuenta de Google for Work.

Los cambios que hice fueron:

  • Quitar la línea con DIRECTORY_PARAM_KEY , ya que no lo encontré para hacer ninguna diferencia
  • Quita ContactsQuery.SELECTION de la instrucción return, porque esa constante evita que los contactos "invisibles" se muestren.

Los cambios se realizaron en ContactsListFragment.java

 @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { // If this is the loader for finding contacts in the Contacts Provider // (the only one supported) if (id == ContactsQuery.QUERY_ID) { Uri contentUri; // There are two types of searches, one which displays all contacts and // one which filters contacts by a search query. If mSearchTerm is set // then a search query has been entered and the latter should be used. if (mSearchTerm == null) { // Since there's no search string, use the content URI that searches the entire // Contacts table contentUri = ContactsQuery.CONTENT_URI; } else { // Since there's a search string, use the special content Uri that searches the // Contacts table. The URI consists of a base Uri and the search string. contentUri = Uri.withAppendedPath(ContactsQuery.FILTER_URI, Uri.encode(mSearchTerm)); } // HERE COMES YOUR CODE (except the DIRECTORY_PARAM_KEY line) Uri.Builder builder = contentUri.buildUpon(); builder.appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_NAME, "example@mycompany.com"); builder.appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_TYPE, "com.google"); contentUri = builder.build(); // Returns a new CursorLoader for querying the Contacts table. No arguments are used // for the selection clause. The search string is either encoded onto the content URI, // or no contacts search string is used. The other search criteria are constants. See // the ContactsQuery interface. return new CursorLoader(getActivity(), contentUri, ContactsQuery.PROJECTION, null, // I REMOVED SELECTION HERE null, ContactsQuery.SORT_ORDER); } Log.e(TAG, "onCreateLoader - incorrect ID provided (" + id + ")"); return null; } 
  • Cómo crear un contacto programáticamente
  • ¿Cuál es el tipo / nombre de cuenta predeterminado para contactos en la aplicación de contacto de Android?
  • Busque contactos usando el nombre así como la empresa (como en la aplicación predeterminada de contactos de Android 2.3.3)
  • ContentObserver para actualización de contacto manualmente
  • ¿Por qué se censuran algunos contactos de las aplicaciones de Android?
  • Insertar contacto en Android con ContactsContract
  • Obtener el perfil de usuario / propietario de contacto URI y la imagen de usuario con API 8 en adelante
  • Obtención de un cursor SINGLE con detalles de nombre completo y números de teléfono
  • Modificación de la información de contacto
  • Cómo actualizar sólo los contactos en lugar de agregar en el adaptador de sincronización
  • ¿Cómo encontrar y recopilar toda la información disponible en un contacto de dar en cualquier teléfono de Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.