Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Obtener el nombre y el apellido de un contacto en lugar de un solo nombre para mostrar?

Actualmente estoy trabajando con el proveedor de contenido de contactos de Android y actualmente puedo acceder a un nombre completo de presentación de contactos sin problema con el siguiente código:

String[] PROJECTION = new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.HAS_PHONE_NUMBER, }; String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; String SELECTION = "LOWER(" + ContactsContract.Contacts.DISPLAY_NAME + ")" + " LIKE '" + constraint + "%' " + "and " + ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '1'"; Cursor cur = managedQuery(ContactsContract.Contacts.CONTENT_URI, PROJECTION, SELECTION, null, sortOrder); 

Sin embargo quiero poder conseguir ambos los contactos primero y apellido por separado, he intentado utilizar el StructuredName en un intento de conseguir esto pero no puedo parecer conseguirlo el trabajar.

¿Puede alguien apuntarme en la dirección correcta en cuanto a cómo utilizar el StructuredName correctamente para obtener el nombre dividido en primero y último?

ACTUALIZAR:

Siguiendo el consejo de hovanessyan he intentado lo siguiente:

  String[] PROJECTION = new String[] { ContactsContract.Data._ID, ContactsContract.Data.DISPLAY_NAME, ContactsContract.Data.HAS_PHONE_NUMBER, }; String SELECTION = ContactsContract.CommonDataKinds.StructuredName.IN_VISIBLE_GROUP + " = '1'"; String sortOrder = ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; Cursor cursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI, PROJECTION, SELECTION, null, sortOrder); int indexGivenName = cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME); int indexFamilyName = cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME); int indexDisplayName = cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME); while (cursor.moveToNext()) { String given = cursor.getString(indexGivenName); String family = cursor.getString(indexFamilyName); String display = cursor.getString(indexDisplayName); Log.e("XXX", "Name: | " + given + " | " + family + " | " + display); } 

Sin embargo, el uso de la PROYECCIÓN provoca un bloqueo de la siguiente manera:

 12-08 16:52:01.575: E/AndroidRuntime(7912): Caused by: java.lang.IllegalArgumentException: Invalid column has_phone_number 

Si quito la PROYECCIÓN obtengo todos los resultados impresos pero muchos de ellos contienen NULL.

Por ejemplo:

 12-08 16:56:14.055: E/XXX(8155): Name: | null | null | null 12-08 16:56:14.055: E/XXX(8155): Name: | null | null | null 12-08 16:56:14.055: E/XXX(8155): Name: | null | null | null 12-08 16:56:14.055: E/XXX(8155): Name: | null | null | null 

Entonces, ¿puede alguien ver lo que estoy haciendo mal en que mi PROYECCIÓN no funciona?

ACTUALIZACIÓN ADICIONAL:

He resuelto los problemas con mi PROYECCIÓN pero ahora tengo un problema donde el proveedor de contenido de DATOS me está proporcionando de nuevo con todos los datos nulos y causando excepciones de puntero NULL en mi código.

Un recuento de cursor de ContactsContract.Contacts me devuelve 115 por ejemplo, pero utilizando la tabla DATA me devuelve 464 usando los mismos parámetros y esto está causando enormes problemas en mi aplicación.

¿Alguien tiene alguna idea de por qué?

3 Solutions collect form web for “Obtener el nombre y el apellido de un contacto en lugar de un solo nombre para mostrar?”

Eche un vistazo a la clase ContactsContract.CommonDataKinds.StructuredName . Usted tiene todas las columnas necesarias allí, y probablemente puede hacer algo como:

 Cursor cursor = contentResolver.query(ContactsContract.Data.CONTENT_URI, other_query_params_for_filtering); int indexGivenName = cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME); int indexFamilyName = cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME); int indexDisplayName = cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME); while (cursor.moveToNext()) { String given = cursor.getString(indexGivenName); String family = cursor.getString(indexFamilyName); String display = cursor.getString(indexDisplayName); } 

Esta es una función general para obtener datos de usuario de la tabla ContactsContract.Data :

 Map<String, String> result = new HashMap<>(); Cursor cursor = context.getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, ContactsContract.Data.CONTACT_ID + "='" + YOUR_CONTACT_ID + "'", null, null); if (cursor != null) { while (cursor.moveToNext()) { String mime = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.MIMETYPE)); switch (mime) { case ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE: result.put(FIRST_NAME, cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME))); result.put(LAST_NAME, cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME))); break; case ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE: result.put(CITY, cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY))); result.put(STREET, cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET))); result.put(ZIP, cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE))); break; case ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE: if (ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE == cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE))) { result.put(MOBILE, cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); } break; } } cursor.close(); } return result; 
  Cursor phone_cursor = cr.query(ContactsContract.CommonDataKinds. Phone.CONTENT_URI, null, null, null, null); while (phone_cursor.moveToNext()) { try { int id = Integer.parseInt(phone_cursor.getString(phone_cursor.getColumnIndex (ContactsContract.CommonDataKinds.Phone.CONTACT_ID))); Cursor name_cursor = cr.query(ContactsContract.Data.CONTENT_URI,null, ContactsContract.Data.CONTACT_ID + " = " + id, null, null); String name = phone_cursor.getString(phone_cursor.getColumnIndex (ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); String first_name =""; String last_name = ""; while (name_cursor.moveToNext()) { if(name_cursor.getString(name_cursor.getColumnIndex (ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME))!=null){ first_name = name_cursor.getString(name_cursor.getColumnIndex (ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME)); last_name = name_cursor.getString(name_cursor.getColumnIndex (ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME)); }} name_cursor.close(); String phoneNumber = phone_cursor.getString(phone_cursor.getColumnIndex (ContactsContract.CommonDataKinds.Phone.NUMBER)); } catch (Exception e) { } } phone_cursor.close(); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.