2011-02-14 10 views
26

He leído las soluciones ya publicadas, pero no dicen cómo utilizo la pantalla de detalles de contacto del sistema para seleccionar cualquier número ONE para usar? Estoy desarrollando una aplicación de envío de sms que ofrece elegir los contactos del teléfono y el número que un usuario quiere usar para enviar a ...Cómo llamar a la lista de contactos de Android Y Seleccione un número de teléfono en la pantalla de detalles?

Hasta ahora no he podido encontrar nada para elegir cualquiera número. ¿Solo tiene que hacerse programáticamente? ¿recupera todos los números de la base de datos y le envía sms?

Saludos

Sherry

+0

Hola, ¿tiene alguna solución? Como también estoy buscando lo mismo. Solo puedo elegir un número de teléfono con 'nueva intención (Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);' pero esa pantalla no muestra las fotos que necesito. – Vasu

+0

revise este enlace http://stackoverflow.com/a/9798765/1282492 – Akiff

Respuesta

55

uf, me tomó algún tiempo, pero creo que tengo la respuesta que necesita (incluso si es demasiado tarde, pero todavía post-it como referencia para otros).

En la aplicación que estoy desarrollando actualmente, el usuario puede ingresar un número de teléfono en y EditText o hacer clic en un botón y seleccionar una persona de la libreta de direcciones de los teléfonos. si la persona tiene más de un número de teléfono, hay una lista desplegable donde puede seleccionar exactamente uno de ellos.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.contact_picker); 

    // this opens the activity. note the Intent.ACTION_GET_CONTENT 
    // and the intent.setType 
    ((Button)findViewById(R.id.pick_person)).setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // user BoD suggests using Intent.ACTION_PICK instead of .ACTION_GET_CONTENT to avoid the chooser 
      Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
      // BoD con't: CONTENT_TYPE instead of CONTENT_ITEM_TYPE 
      intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); 
      startActivityForResult(intent, 1);     
     } 
    }); 
} 

ahora, tan pronto como el usuario selecciona un contacto (y, probablemente, elige uno de varios números de teléfono), puede recuperar los datos de la forma habitual:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (data != null) { 
     Uri uri = data.getData(); 

     if (uri != null) { 
      Cursor c = null; 
      try { 
       c = getContentResolver().query(uri, new String[]{ 
          ContactsContract.CommonDataKinds.Phone.NUMBER, 
          ContactsContract.CommonDataKinds.Phone.TYPE }, 
         null, null, null); 

       if (c != null && c.moveToFirst()) { 
        String number = c.getString(0); 
        int type = c.getInt(1); 
        showSelectedNumber(type, number); 
       } 
      } finally { 
       if (c != null) { 
        c.close(); 
       } 
      } 
     } 
    } 
} 

public void showSelectedNumber(int type, String number) { 
    Toast.makeText(this, type + ": " + number, Toast.LENGTH_LONG).show();  
} 

aquí está el documentation for CommonDataKinds.Phone for on dev.android.

el int "tipo" te dice el tipo de número: móvil (2), hogar (1), trabajo (3), y así sucesivamente.

nota: después de que el usuario selecciona el contacto, obtiene un girador de números sin indicación del tipo de números. eso no es realmente fácil de usar: si un contacto tiene 5 números asignados ... uh, ¿cuál de estos es el número de fax de nuevo?

otra nota: el ejemplo anterior necesita el sdk> 5 (Android 2.0+), entonces no 1.6 (= sdk 4). 1.6 tiene una api diferente, y si desea admitir ambas versiones, lea article about the contacts API on dev.android.

buena suerte.

exención de responsabilidad: He copiado la mayor parte de mi código de la PickContact.java example

+6

Con ACTION_GET_CONTENT y CONTENT_ITEM_TYPE a veces obtiene otras aplicaciones en el selector (por ejemplo, DropBox y OI File Manager), lo que puede ser indeseable. Usar ACTION_PICK y CONTENT_TYPE en su lugar resuelve este problema. – BoD

+0

gracias, he actualizado la fuente de ejemplo. – stefs

3

este código sólo funciona bien para mí

@Override 
public void onClick(View arg0) { 
    // TODO Auto-generated method stub 

    Intent i = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI); 
    super.startActivityForResult(i, 1001); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // TODO Auto-generated method stub 
    super.onActivityResult(requestCode, resultCode, data); 

    switch (requestCode) { 
    case 1001: 

     if (resultCode == Activity.RESULT_OK) { 

      Cursor s = getContentResolver().query(Phone.CONTENT_URI, null, 
        null, null, null); 

     if (s.moveToFirst()) { 
       String phoneNum = s.getString(s.getColumnIndex(Phone.NUMBER)); 
       Toast.makeText(getBaseContext(), phoneNum, Toast.LENGTH_LONG).show(); 
          } 

     } 

     break; 

    } 

} 
+0

buen ejemplo ... bueno uno. –

2

Prueba este código, estoy seguro de que funcionará

Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
      intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); 
      startActivityForResult(intent, PICK_CONTACT); 
+0

Esto abre un intento genérico, creo que funcionará, pero no es la mejor solución –

0

INTENTE ESTE

setContentView(R.layout.main); 

    contactNumber = (TextView)findViewById(R.id.contactnumber); 

    Button buttonPickContact = (Button)findViewById(R.id.pickcontact); 
    buttonPickContact.setOnClickListener(new Button.OnClickListener(){ 

    @Override 
    public void onClick(View arg0) { 
    // TODO Auto-generated method stub 


    Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
    intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); 
    startActivityForResult(intent, 1);    


    }}); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // TODO Auto-generated method stub 
    super.onActivityResult(requestCode, resultCode, data); 

    if(requestCode == RQS_PICK_CONTACT){ 
    if(resultCode == RESULT_OK){ 
    Uri contactData = data.getData(); 
    Cursor cursor = managedQuery(contactData, null, null, null, null); 
    cursor.moveToFirst(); 

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

     //contactName.setText(name); 
     contactNumber.setText(number); 
     //contactEmail.setText(email); 
    } 
    } 
    } 
    } 

EDITAR XML

<?xml version="1.0" encoding="utf-8"?> 
     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="vertical" > 

     <Button 
     android:id="@+id/pickcontact" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Pick Contact" /> 

     <TextView 
     android:id="@+id/contactnumber" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 
2

Hay un problema en la respuesta aceptada. Si el número seleccionado contiene espacios dentro de él
es decir, 85 29 948789 , entonces mostrará solo 85 (hasta el primer espacio).

a fin de utilizar el código de abajo para rectificar este problema :)

Intent intent1 = new Intent(Intent.ACTION_PICK); 
intent1.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE); 
      startActivityForResult(intent1, 1); 

y en onActivityResult

Uri contactUri = data.getData(); 

    String[] projection = {ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME}; 


    Cursor cursor = getContentResolver() 
      .query(contactUri, projection, null, null, null); 
    cursor.moveToFirst(); 


    int numberColumn = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); 
    int nameColumn = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME); 
    String number = cursor.getString(numberColumn); 
    String name = cursor.getString(nameColumn); 
Cuestiones relacionadas