Android: muestra los contactos de la agenda y selecciona uno
Quiero mostrar la lista de contactos en la agenda telefónica con un clic de un botón y luego seleccionar uno de los contactos de ella y luego recuperar su número de contacto? No quiero hacer mi lista personalizada, ¿hay una manera de usar androides construido en la funcionalidad?
- ¿Cómo obtener el recuento de líneas de textview antes de renderizar?
- Cómo crear un menú de barra lateral
- ¿Cómo puede HierarchyViewer herramienta de estudio de Android conocer las propiedades de las vistas de la pantalla de Android
- ¿Cómo obtengo el tokenizer MultiAutoCompleteTextView similar a la aplicación de Facebook?
- Eficiencia de findViewById
- ¿Por qué el diálogo personalizado de Android aparece en pantalla completa?
- ¿Cómo hacer que las aplicaciones de Android 4.0 sean compatibles con versiones anteriores?
- Modificación de la imagen de recurso de la barra de progreso
- Android edittext auto crecer con el texto y empujar las cosas hacia abajo
- Barra de acción - posicionamiento de los elementos de acción
- Reducir márgenes en los diseños de Android
- Java.lang.NullPointerException: Intenta invocar el método virtual 'int android.view.View.getImportantForAccessibility ()' en una referencia de objeto nulo
- Utilizar un prefijo de espacio de nombres no androide en elementos secundarios en un diseño
INTENTA ESTO ->
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); } } } }
EDIT XML ADDED;
<?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>
Intent i=new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); startActivityForResult(i, PICK_REQUEST);
El Intent
entregado a su método onActivityResult()
contendrá el Uri
del contacto elegido – obtendrá esto llamando a getData()
en ese Intent
.
Aquí hay un proyecto de ejemplo que demuestra esto, con la lógica que se está implementando en un fragmento retenido, por lo que se cuelga en el contacto seleccionado a través de cambios de configuración (por ejemplo, el usuario gira la pantalla).
También puedes usar ACTION_GET_CONTENT
para esto, y creo que ese es el patrón más moderno, aunque ACTION_PICK
ciertamente funciona y es todo lo que tengo código de ejemplo en el momento de escribir esto. Si está leyendo esto en el futuro (hi, future!), Es posible que la muestra vinculada a se haya actualizado para utilizar ACTION_GET_CONTENT
.
Veo que esta pregunta es vieja, pero estaba haciendo lo mismo en mi aplicación y pensé en publicar mi código aquí, si eso ayuda a alguien en el futuro.
Esta es la forma de iniciar una nueva intención para mostrar la lista
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); startActivityForResult(intent, PICK_CONTACT);
Y esto es cómo procesar el resultado
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == PICK_CONTACT) { if (resultCode == RESULT_OK) { Uri contactData = data.getData(); String number = ""; Cursor cursor = getContentResolver().query(contactData, null, null, null, null); cursor.moveToFirst(); String hasPhone = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.HAS_PHONE_NUMBER)); String contactId = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID)); if (hasPhone.equals("1")) { Cursor phones = getContentResolver().query (ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null); while (phones.moveToNext()) { number = phones.getString(phones.getColumnIndex (ContactsContract.CommonDataKinds.Phone.NUMBER)).replaceAll("[-() ]", ""); } phones.close(); //Do something with number } else { Toast.makeText(getApplicationContext(), "This contact has no phone number", Toast.LENGTH_LONG).show(); } cursor.close(); } } } }
PICK_CONTACT es una constante definida en la clase.
En el emulador del nexo 5x que probé esto:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); startActivityForResult(intent, 1);
o:
Uri uri = Uri.parse("content://contacts"); Intent intent = new Intent(Intent.ACTION_PICK, uri); intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE); startActivityForResult(intent, 1);
No funcionó para todos los contactos. No sé por qué. pero esto:
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); startActivityForResult(intent, 1);
trabajos.
- ¿Detectar si url especificada es una imagen en Android?
- Finalizar el problema de la elipse con TextViews