Recuperar un número de teléfono con ContactsContract en Android: la función no funciona

Escribí la función siguiente para recuperar un solo número de teléfono que pertenece al contacto con id "contactID".

La función que es recuperar el número de teléfono:

private String getContactPhone(String contactID) { Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; String[] projection = null; String where = ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?"; String[] selectionArgs = new String[] { contactID }; String sortOrder = null; Cursor result = managedQuery(uri, projection, where, selectionArgs, sortOrder); if (result.moveToFirst()) { String phone = result.getString(result.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); if (phone == null) { result.close(); return null; } result.close(); return phone; } result.close(); return null; } 

Cómo se llama a esta función:

 ArrayList<Contact> resultContacts = new ArrayList<Contact>(); Cursor result = null; Uri uri = ContactsContract.Data.CONTENT_URI; String[] projection = new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.CommonDataKinds.Event.CONTACT_ID, ContactsContract.CommonDataKinds.Event.START_DATE, }; String where = ContactsContract.Data.MIMETYPE+" = ? AND "+ContactsContract.CommonDataKinds.Event.TYPE+" = "+ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY; String[] selectionArgs = new String[] {ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE}; String sortOrder = null; result = managedQuery(uri, projection, where, selectionArgs, sortOrder); while (result.moveToNext()) { Long id = result.getLong(result.getColumnIndex(ContactsContract.Contacts._ID)); String phone = getContactPhone(String.valueOf(id)); ... } ... 

Desafortunadamente, no funciona. Obtengo null si llamo a esta función con el valor que obtuve de "ContactsContract.Contacts._ID". ¿Por qué esto es tan? ¿Qué está mal?

Edit: Solía ​​asignar Contacts._ID a CommonDataKinds.Phone.CONTACT_ID – que no funcionó. Pero ahora asigno Contacts.DISPLAY_NAME a CommonDataKinds.Phone.DISPLAY_NAME y funciona de repente – extraño, ¿no? Pero prefiero asignar los ID en lugar de los nombres de pantalla. Así que la pregunta sigue siendo de actualidad. ¿Esto podría deberse a diferentes identificaciones en esas tablas? ¿No es esto por qué hay identificaciones de búsqueda?

Para obtener el identificador de contacto en la primera parte, debe utilizar:

 ContactsContract.Data.CONTACT_ID 

en lugar de:

 ContactsContract.Contacts._ID 

Así que la proyección debe ser:

 String[] projection = new String[] { ContactsContract.Data.CONTACT_ID, ContactsContract.CommonDataKinds.Event.CONTACT_ID, ContactsContract.CommonDataKinds.Event.START_DATE, }; 

Y luego, por supuesto, obtener la fila correcta:

 Long id = result.getLong(result.getColumnIndex(ContactsContract.Data.CONTACT_ID)); 

Usted obtiene nulo porque ha establecido su proyección en nulo. La proyección es básicamente la lista de columnas que desea devolver, por ejemplo

 String[] projection = {ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.HAS_PHONE_NUMBER}; 

Por lo general, cuando encuentras el contacto, pueden tener una lista de números de teléfono, por lo que tienes que usar otro cursor para iterar a través de los números de teléfono, por ejemplo

 Cursor phones = mContext.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId, null, null); while (phones.moveToNext()) { phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA)); } 

Espero que esto ayude.

Su código para getContactPhone () funciona bien en mi final. He probado mediante el lanzamiento de un selector de contactos, la selección de un contacto, a continuación, utilizando el ID que se devolvió y pasó que en su método.

Por lo tanto, sospecho que de hecho está pasando una identificación no válida. ¿Puede publicar la traza de pila completa para la excepción de puntero nulo?

Sí, las claves de búsqueda están disponibles porque no se garantiza que los _IDs permanezcan iguales ya que las sincronizaciones y la agregación de contactos los cambian.

  • Utilizar autocompletar texto con número de teléfono de contactos
  • Android: ¿Cómo obtener la identificación de contacto por el número de teléfono?
  • No se ha encontrado actividad para manejar la acción intencional.
  • MSISDN: ¿Es una tarjeta SIM datos? ¿Por qué toda la función proporcionada (desde Blackberry y Android) para buscar MSISDN no es fiable?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.