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í.
- Acciones personalizadas en la aplicación Contactos (similar a G +)
- Android, cómo obtener fotos de contacto de Facebook / Twitter / etc
- Android SDK: código fuente de Contact ContentProvider
- Cómo obtener el número de teléfono de los contactos mediante ContentProvider - Android
- Obtenga todos los nombres y números de contacto como una lista de cadenas en Android
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(); } } }
- ¿Cómo comprobar si un contacto en el libro de teléfonos android tiene whatsapp habilitado?
- Práctica recomendada para mostrar los contactos de Android + números de teléfono
- ¿Cómo comprobar si un cursor está vacío?
- Contactos de búsqueda inteligente en android
- Integrar mi aplicación con el contacto
- ¿Posible obtener información de contacto "Propietario" en Android?
- Modificación de la información de contacto
- ¿Cómo obtener el ID o url de facebook de un contacto de los contactos nativos / resolución de contenidos?
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
- Dagger 2 generó el componente de prueba no reconocido
- Límite de tamaño de archivo de Android Market. 50MB o 4GB?