9

Estoy tratando de permitir que un usuario seleccione un número de teléfono de un contacto usando el selector de contactos. Sin embargo, en este momento todos los ejemplos que veo en línea muestran cómo puede seleccionar un contacto, pero espero tener una segunda pantalla y luego emergente si ese contacto tiene varios números de teléfono para que pueda especificar cuál desea seleccionar (el camino ese mensaje de texto te permite hacerlo cuando seleccionas un contacto).Seleccionar un número del usuario con varios números al usar el selector de contactos

Mi pregunta es, ¿tiene que recopilar todos los números y luego pedirle al usuario que seleccione un número, o esta funcionalidad ya está integrada en Android? Espero haber olvidado una bandera o algo así.

Respuesta

5

Pude hacer esto creando un segundo cuadro de diálogo que muestra todos los números de teléfono asociados con un contacto. En primer lugar, llamar a este en algún lugar de su código:

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

Luego, en onActivityResult() usar esto para decidir si el contacto seleccionado tiene varios números de teléfono, y mostrar un cuadro de diálogo si es así:

Uri result = data.getData(); 
Log.v(TAG, "Got a result: " + result.toString()); 

// get the contact id from the Uri 
String id = result.getLastPathSegment(); 

// query for phone numbers for the selected contact id 
c = getContentResolver().query(
    Phone.CONTENT_URI, null, 
    Phone.CONTACT_ID + "=?", 
    new String[]{id}, null); 

int phoneIdx = c.getColumnIndex(Phone.NUMBER); 
int phoneType = c.getColumnIndex(Phone.TYPE); 

if(c.getCount() > 1) { // contact has multiple phone numbers 
    final CharSequence[] numbers = new CharSequence[c.getCount()]; 
    int i=0; 
    if(c.moveToFirst()) { 
     while(!c.isAfterLast()) { // for each phone number, add it to the numbers array 
      String type = (String) Phone.getTypeLabel(this.getResources(), c.getInt(phoneType), ""); // insert a type string in front of the number 
      String number = type + ": " + c.getString(phoneIdx); 
      numbers[i++] = number; 
      c.moveToNext(); 
     } 
     // build and show a simple dialog that allows the user to select a number 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setTitle(R.string.select_contact_phone_number_and_type); 
     builder.setItems(numbers, new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int item) { 
       String number = (String) numbers[item]; 
       int index = number.indexOf(":"); 
       number = number.substring(index + 2); 
       loadContactInfo(number); // do something with the selected number 
      } 
     }); 
     AlertDialog alert = builder.create(); 
     alert.setOwnerActivity(this); 
     alert.show(); 

    } else Log.w(TAG, "No results"); 
} else if(c.getCount() == 1) { 
    // contact has a single phone number, so there's no need to display a second dialog 
} 

I Sé que esta es una vieja pregunta, pero espero que ayude.

+0

¿cómo puedo obtener el nombre también? – dmSherazi

+0

¡Ayudó mucho, gracias! –

+0

me ayudó también, gracias amigo! –

9

Como alternativa, inicialmente puede visualizar los números de teléfono asociados con cada contacto en el Selector de contactos y seleccionar uno de esa manera. Lanzamiento de contacto selector de esta manera (nótese el URI diferente que mi otra respuesta):

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Phone.CONTENT_URI); 
startActivityForResult(intent, REQUEST_PICK_CONTACT); 

Luego, en onActivityResult():

Uri result = data.getData(); 
Log.v(TAG, "Got a result: " + result.toString()); 

// get the phone number id from the Uri 
String id = result.getLastPathSegment(); 

// query the phone numbers for the selected phone number id 
Cursor c = getContentResolver().query(
    Phone.CONTENT_URI, null, 
    Phone._ID + "=?", 
    new String[]{id}, null); 

int phoneIdx = c.getColumnIndex(Phone.NUMBER); 

if(c.getCount() == 1) { // contact has a single phone number 
    // get the only phone number 
    if(c.moveToFirst()) { 
     phone = c.getString(phoneIdx); 
     Log.v(TAG, "Got phone number: " + phone); 

     loadContactInfo(phone); // do something with the phone number 

    } else { 
     Log.w(TAG, "No results"); 
    } 
} 
+0

Más fácil de implementar, menos código. +1 –

+2

Además, si agrega un código, también puede obtener el nombre para mostrar: 'int nameIdx = c.getColumnIndex (Phone.DISPLAY_NAME); // inserte esto a continuación donde se crea phoneIdx' y 'contactName = c.getString (nameIdx); // inserte este teléfono a continuación = c.getString (phoneIdx); ' –

+0

@howettl ¿hay algún URI que muestre un solo cuadro de diálogo (dentro de la aplicación de contactos como lo hizo el URI anterior) para elegir los correos electrónicos también junto con los números de teléfono? – cgr

3

Por si alguien tropieza con esto otra vez.

Otra alternativa a las otras respuestas es la biblioteca https://github.com/codinguser/android_contact_picker

Full Disclosure: Yo soy el autor de esta biblioteca

+0

Debo encontrar la manera de extender tu biblioteca para que también recoja correos electrónicos (1 de n). –

+0

Creo que debería ser relativamente fácil de hacer – codinguser

+0

No es tan fácil. De todos modos, no perderé más tiempo con esta biblioteca, ya que no funciona en absoluto para mí (estoy usando Eclipse). Entonces, es mejor que encuentre alguna otra solución. –

0

es sencilla se explica en los desarrolladores de Android Referencia: https://developer.android.com/training/contacts-provider/modify-data.html#InsertEdit

y código de anexión simple:

String phoneNumber = "+01 123 456 789"; 
Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT); 
intent.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE); 
intent.putExtra(ContactsContract.Intents.Insert.PHONE, phoneNumber); 
if (intent.resolveActivity(getPackageManager()) != null) { 
startActivityForResult(intent, REQUEST_CODE_ADD_PHONE_CONTACT); 
} 

si necesita el resultado de la actividad, debe escuchar el evento onActivityResult on Activity por la variable REQUEST_CODE_ADD_PHONE_CONTACT.

Cuestiones relacionadas