Problemas con ContactsContract.CommonDataKinds.StructuredName

Tengo la mayoría de las cosas funcionando al consultar los datos de contacto. Estoy luchando con StructuredName y Organización. No funcionan para mí.

Si no te importa, echa un vistazo al código. Es hecho a mano y gran cantidad de comprobación de errores se elimina para que sea lo más pequeño posible para publicarse aquí. Los comentarios con "no funciona" son las partes que no funcionan para mí.

Los dos principales if () son parte del onActivityResult donde recibo los datos al final de la selección de contacto. La llamada se hace con:

intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); startActivityForResult(intent, Main.DIALOG_PICKCONTACT); 

Muchas gracias de antemano HJW

 if (requestCode == Main.DIALOG_PICKCONTACT) { if (resultCode == RESULT_OK) { int i; String s; Cursor cursorContacts = managedQuery(intent.getData(), null, null, null, null); if (cursorContacts != null) { if (cursorContacts.moveToNext()) { ContentResolver contentResolver = getContentResolver(); String contactId = cursorContacts.getString(cursorContacts.getColumnIndex(ContactsContract.Contacts._ID)); i = cursorContacts.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); // cursorContacts.getString(i); *** is DISPLAY_NAME Cursor cursorEmail = contentResolver.query( ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[] { contactId }, null); if (cursorEmail != null) { while (cursorEmail.moveToNext()) { int type = cursorEmail.getInt(cursorEmail.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)); s = cursorEmail.getString(cursorEmail.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); switch (type) { case ContactsContract.CommonDataKinds.Email.TYPE_HOME: // s *** is private Email break; case ContactsContract.CommonDataKinds.Email.TYPE_WORK: // s *** is business Email break; } } cursorEmail.close(); } Cursor cursorOrganization = contentResolver.query( ContactsContract.Data.CONTENT_URI, null, ContactsContract.CommonDataKinds.Organization.CONTACT_ID + " = ?", new String[] { contactId }, null); if (cursorOrganization != null) { if (cursorOrganization.moveToNext()) { s = cursorOrganization.getString(cursorOrganization.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DATA)); // s *** Company name not working s = cursorOrganization.getString(cursorOrganization.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE)); // s *** Function within company not working } cursorOrganization.close(); } s = cursorContacts.getString(cursorContacts.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)); if (Integer.parseInt(s) > 0) { Cursor cursorPhone = contentResolver.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { contactId }, null); if (cursorPhone != null) { while (cursorPhone.moveToNext()) { int type = cursorPhone.getInt(cursorPhone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)); s = cursorPhone.getString(cursorPhone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); switch (type) { case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME: // s *** is private fax break; case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK: // s *** is business fax break; case ContactsContract.CommonDataKinds.Phone.TYPE_HOME: // s *** is private phone break; case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE: // s *** is mobile phone break; case ContactsContract.CommonDataKinds.Phone.TYPE_WORK: // s *** is business phone break; case ContactsContract.CommonDataKinds.Phone.TYPE_WORK_MOBILE: // s *** is business mobile break; } } cursorPhone.close(); } } Cursor cursorStructuredName = contentResolver.query( ContactsContract.Data.CONTENT_URI, null, ContactsContract.CommonDataKinds.StructuredName.CONTACT_ID + " = ?", new String[] { contactId }, null); if (cursorStructuredName != null) { if (cursorStructuredName.moveToNext()) { i = cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME); // cursorStructuredName.getString(i); *** given name not working i = cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME); // cursorStructuredName.getString(i); *** middle name not working i = cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.PREFIX); // cursorStructuredName.getString(i); *** prefix not working i = cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.SUFFIX); // cursorStructuredName.getString(i); *** suffix not working } cursorStructuredName.close(); } Cursor cursorStructuredPostal = contentResolver.query( ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI, null, ContactsContract.CommonDataKinds.StructuredPostal.CONTACT_ID + " = ?", new String[] { contactId }, null); if (cursorStructuredPostal != null) { while (cursorStructuredPostal.moveToNext()) { int type = cursorStructuredPostal.getInt(cursorStructuredPostal.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE)); s = cursorStructuredPostal.getString(cursorStructuredPostal.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY)); switch (type) { case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME: //s *** is private country break; case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK: // s *** is business country break; } s = cursorStructuredPostal.getString(cursorStructuredPostal.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY)); switch (type) { case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME: // s *** is private city break; case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK: // s *** is business city break; } s = cursorStructuredPostal.getString(cursorStructuredPostal.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE)); switch (type) { case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME: // s *** is private postcode break; case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK: // s *** is business postcode break; } s = cursorStructuredPostal.getString(cursorStructuredPostal.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET)); switch (type) { case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME: // s *** is private street break; case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK: // s *** is business street break; } } cursorStructuredPostal.close(); } Cursor cursorWebsite = contentResolver.query( ContactsContract.Data.CONTENT_URI, null, ContactsContract.CommonDataKinds.Website.CONTACT_ID + " = ?", new String[] { contactId }, null); if (cursorWebsite != null) { while (cursorWebsite.moveToNext()) { i = cursorWebsite.getColumnIndex(ContactsContract.CommonDataKinds.Website.URL); int type = cursorWebsite.getColumnIndex(ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE); s = cursorWebsite.getString(i); switch (type) { case ContactsContract.CommonDataKinds.Website.TYPE_HOME: // s *** private url not working break; case ContactsContract.CommonDataKinds.Website.TYPE_WORK: // s *** business url not working break; } } cursorWebsite.close(); } } cursorContacts.close(); } } } 

Su situación es incorrecta.

Utilice esto para StructuredName:

  // projection String[] projection = new String[] {ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME}; String where = ContactsContract.Data.RAW_CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; String[] whereParameters = new String[]{this.contact_id, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE}; //Request Cursor contacts = this.resolver.query(ContactsContract.Data.CONTENT_URI, projection, where, whereParameters, null); //Iteration if (contacts.moveToFirst()) { //code here } contacts.close(); 

No se pudo encontrar la solución completa de cómo obtener primero, último, segundo nombre y cumpleaños de una persona escogida de los contactos. Así que aquí está mi solución:

Mostrar una lista de contactos:

 Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); startActivityForResult(intent, GET_PHONE_ADDRESS_BOOK_CONST); 

Recoja un contacto:

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK) { switch (requestCode) { case GET_PHONE_ADDRESS_BOOK_CONST: getContactFromAddressBook(data); break; default: break; } } super.onActivityResult(requestCode, resultCode, data); } 

Obtener el ID de contacto:

 private void getContactFromAddressBook(Intent data) { if (data != null) { Uri uri = data.getData(); if (uri != null) { Cursor c = null; try { c = getActivity().getContentResolver().query(uri, null, null, null, null); if (c != null && c.moveToFirst()) { String id = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID)); getFullName(id); getBirthday(id); } } catch(Exception e) { Utils.Loge(e.getMessage(), e); } finally { if (c != null) { c.close(); } } } } } 

Obtener el primero, el último y el segundo nombre

 private HashMap<String, String> getFullName(String id) { HashMap<String, String> ret = new HashMap<String, String>(); String whereName = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; String[] whereNameParams = new String[] { id, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE }; Cursor c = null; try { c = getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, whereName, whereNameParams, null); if (c != null && c.moveToFirst()) { int indexGivenName = c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME); int indexFamilyName = c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME); int indexDisplayName = c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME); ret.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, c.getString(indexGivenName)); ret.put(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, c.getString(indexFamilyName)); ret.put(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME, c.getString(indexDisplayName)); } } catch(Exception e) { Utils.Loge(e.getMessage(), e); } finally { if (c != null) { c.close(); } } return ret; } 

Obtener cumpleaños

 private Date getBirthday(String id) { Date date = null; String whereName = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ? AND " + ContactsContract.CommonDataKinds.Event.TYPE + " = ?"; String[] whereNameParams = new String[] { id, ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE, String.valueOf(ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY) }; Cursor c = null; try { c = getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, whereName, whereNameParams, null); if (c != null && c.moveToFirst()) { int indexBirthday = c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Event.START_DATE); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.US); date = format.parse(c.getString(indexBirthday)); } } catch(Exception e) { Utils.Loge(e.getMessage(), e); } finally { if (c != null) { c.close(); } } return date; } 
 private String getWebsite(String contactId) { String[] cols = { ContactsContract.CommonDataKinds.Website.URL }; String filter = ContactsContract.Data.CONTACT_ID+" = ? " + " and "+ContactsContract.Data.MIMETYPE +" = '"+ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE+"'"; String[] params = { String.valueOf(contactId) }; Cursor website = act.managedQuery(ContactsContract.Data.CONTENT_URI, cols, filter, params, null); while (website.moveToNext()) { String val = website.getString(website.getColumnIndex(ContactsContract.CommonDataKinds.Website.URL)); if (!StringUtils.isEmpty(val)) { return val; } } return null; } 

// abb2yb: iluminación ahora

  • Selector de contactos abierto con filtro
  • Cómo reaccionar a los nuevos contactos en la aplicación Contactos de Android
  • ListView de los contactos
  • Intención para contactos con número de teléfono
  • Android Contacts._ID! = Data.CONTACT_ID
  • Campos personalizados en el nuevo contacto
  • ¿Cómo obtener el correo electrónico de los contactos y números de teléfono de los contactos y la clase doesn, t tiene ampliación de la actividad y método oncreate ()?
  • Selecciona el contacto directamente desde el selector de contactos
  • Desea crear un nuevo grupo en los contactos mediante programación
  • Permiso de negación: apertura del proveedor com.android.providers.contacts.ContactsProvider2 de ProcessRecord en Android Studio
  • Sqlite android extraer contactos con número de teléfono
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.