obtener información de contacto del selector de contactos de Android

Intento llamar al selector de contactos, poner el nombre de la persona, el teléfono y el correo electrónico en cadenas y enviarlos a otra actividad con un bash. Hasta ahora esto funciona:

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); startActivityForResult(intent, 1); // ... @Override public void onActivityResult(int reqCode, int resultCode, Intent data) { super.onActivityResult(reqCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { Uri contactData = data.getData(); Cursor c = managedQuery(contactData, null, null, null, null); if (c.moveToFirst()) { String name = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME)); Intent intent = new Intent(CurrentActivity.this, NewActivity.class); intent.putExtra("name", name); startActivityForResult(intent, 0); } } } 

Pero si agrego:

 String number = c.getString(c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

se cierra la fuerza

Tal vez hay otra forma de obtener su número?

    Números de teléfono

    Los números de teléfono se almacenan en su propia tabla y deben consultarse por separado. Para consultar la tabla de números telefónicos, utilice el URI almacenado en la variable SDK ContactsContract.CommonDataKinds.Phone.CONTENT_URI. Use un condicional WHERE para obtener los números de teléfono del contacto especificado.

      if (Integer.parseInt(cur.getString( cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { Cursor pCur = cr.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null); while (pCur.moveToNext()) { // Do something with phones } pCur.close(); } 

    Realice una segunda consulta en la base de datos SQLite de los contactos de Android. Los números de teléfono se consultan contra el URI almacenado en ContactsContract.CommonDataKinds.Phone.CONTENT_URI. El ID de contacto se almacena en la tabla del teléfono como ContactsContract.CommonDataKinds.Phone.CONTACT_ID y la cláusula WHERE se usa para limitar los datos devueltos.

    Correos electrónicos

    Consultar las direcciones de correo electrónico es similar a los números de teléfono. Se debe realizar una consulta para obtener direcciones de correo electrónico de la base de datos. Consulte el URI almacenado en ContactsContract.CommonDataKinds.Email.CONTENT_URI para consultar la tabla de direcciones de correo electrónico.

     Cursor emailCur = cr.query( ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[]{id}, null); while (emailCur.moveToNext()) { // This would allow you get several email addresses // if the email addresses were stored in an array String email = emailCur.getString( emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); String emailType = emailCur.getString( emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)); } emailCur.close(); 

    Al igual que con la consulta telefónica, los nombres de campo para la tabla de correo electrónico también se almacenan en ContactsContract.CommonDataKinds. La consulta de correo electrónico se realiza en el URI en ContactsContract.CommonDataKinds.Email.CONTENT_URI y la cláusula WHERE tiene que coincidir con el campo ContactsContract.CommonDataKinds.Email.CONTACT_ID. Dado que múltiples direcciones de correo electrónico pueden almacenarse en bucle a través de los registros devueltos en el Cursor.

    Más tutoriales aquí

    Este método requiere Android API versión 5 o superior.

    Basándose en la respuesta aceptada, si desea ir directamente a la dirección de correo electrónico deseada y no requerir el permiso de los contactos, use algo como esto:

     private static final int REQUEST_CODE_EMAIL = 1; void startSelectingEmail() { Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Email.CONTENT_URI); startActivityForResult(intent, REQUEST_CODE_EMAIL); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CODE_EMAIL) { Uri emailUri = data.getData(); Cursor emailCursor = getContext().getContentResolver().query(emailUri, null, null, null, null); if (emailCursor != null) { if (emailCursor.moveToFirst()) { String email = emailCursor.getString( emailCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Email.DATA)); String emailType = emailCursor.getString( emailCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Email.TYPE)); Log.d(TAG, "Email: " + emailType + " " + email); } emailCursor.close(); } } } 

    Esto no requiere permiso de los contactos para leer la dirección de correo electrónico como los métodos de consulta doble anteriores. También lo hace para que no necesite escribir UI para que el usuario seleccione la dirección de correo electrónico adecuada para los contactos con varios correos electrónicos, el usuario selecciona un correo electrónico específico en la aplicación Contactos para que solo obtenga un resultado.

    El cursor vuelve con bastantes columnas además de la dirección de correo electrónico como el nombre para mostrar, aunque solo se ha verificado en un Nexus 5 con Android M.