Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Cómo llamar a la lista de contactos de Android?

Estoy haciendo una aplicación para Android y necesito llamar a la lista de contactos del teléfono. Necesito llamar a la función de lista de contactos, seleccionar un contacto y volver a mi aplicación con el nombre del contacto. Aquí está el código que conseguí en el Internet, pero no trabaja.

import android.app.ListActivity; import android.content.Intent; import android.database.Cursor; import android.os.Bundle; import android.provider.Contacts.People; import android.view.View; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.SimpleCursorAdapter; import android.widget.TextView; public class Contacts extends ListActivity { private ListAdapter mAdapter; public TextView pbContact; public static String PBCONTACT; public static final int ACTIVITY_EDIT=1; private static final int ACTIVITY_CREATE=0; // Called when the activity is first created. @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); Cursor C = getContentResolver().query(People.CONTENT_URI, null, null, null, null); startManagingCursor(C); String[] columns = new String[] {People.NAME}; int[] names = new int[] {R.id.row_entry}; mAdapter = new SimpleCursorAdapter(this, R.layout.mycontacts, C, columns, names); setListAdapter(mAdapter); } // end onCreate() // Called when contact is pressed @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); Cursor C = (Cursor) mAdapter.getItem(position); PBCONTACT = C.getString(C.getColumnIndex(People.NAME)); // RHS 05/06 //pbContact = (TextView) findViewById(R.id.myContact); //pbContact.setText(new StringBuilder().append("b")); Intent i = new Intent(this, NoteEdit.class); startActivityForResult(i, ACTIVITY_CREATE); } } 

  • Android: cómo agregar un contacto a la tarjeta SIM con el SDK?
  • Cómo acceder a contactos en mi programa android
  • Cómo obtener contactos que se utilizan en whatsapp u otra aplicación en android
  • Cómo recuperar el nombre de contacto y el número de teléfono en Android
  • ¿Cómo puedo agregar mi conexión de aplicaciones en Agenda / Contactos como Whatsapp y Viber?
  • ¿Cómo obtener los contactos de un grupo de WhatsApp en Android?
  • ¿Cómo actualizar el correo electrónico, dirección, apodo, etc de un contacto en Android?
  • ¿Cómo consigue que los contactos se agreguen correctamente al agregarlos de forma programática?
  • 13 Solutions collect form web for “¿Cómo llamar a la lista de contactos de Android?”

    No estoy 100% seguro de lo que su código de ejemplo se supone que debe hacer, pero el siguiente fragmento debería ayudarle a "llamar a la función de lista de contactos, seleccionar un contacto y volver a [su] aplicación con el nombre del contacto".

    Hay tres pasos para este proceso.

    1. Permisos

    Agregue un permiso para leer los datos de los contactos en el manifiesto de la aplicación.

     <uses-permission android:name="android.permission.READ_CONTACTS"/> 

    2. Llamar al selector de contactos

    Dentro de su Actividad, cree un Intent que pida al sistema que encuentre una Actividad que pueda realizar una acción de PICK desde los ítems de la URI de Contactos.

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

    Llame a startActivityForResult , pasando este Intent (y un entero de código de solicitud, PICK_CONTACT en este ejemplo). Esto hará que Android lance una actividad que está registrada para dar soporte a ACTION_PICK en People.CONTENT_URI , a continuación, volver a esta actividad cuando se realiza la selección (o se cancela).

     startActivityForResult(intent, PICK_CONTACT); 

    3. Escuchar el resultado

    También en su Actividad, anule el método onActivityResult para escuchar la devolución de la actividad 'seleccione un contacto' que inició en el paso 2. Debe comprobar que el código de solicitud devuelto coincide con el valor que espera y que el código de resultado es RESULT_OK .

    Puede obtener el URI del contacto seleccionado llamando a getData() en el parámetro Intent de datos . Para obtener el nombre del contacto seleccionado, necesitará usar ese URI para crear una nueva consulta y extraer el nombre del cursor devuelto.

     @Override public void onActivityResult(int reqCode, int resultCode, Intent data) { super.onActivityResult(reqCode, resultCode, data); switch (reqCode) { case (PICK_CONTACT) : if (resultCode == Activity.RESULT_OK) { Uri contactData = data.getData(); Cursor c = getContentResolver().query(contactData, null, null, null, null); if (c.moveToFirst()) { String name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); // TODO Whatever you want to do with the selected contact name. } } break; } } 

    Código fuente completo: tutorials-android.blogspot.com (cómo llamar a la lista de contactos de android) .

    Lo hago de esta manera para Android 2.2 Froyo liberación: básicamente utilizar eclipse para crear una clase como: public class SomePickContactName extends Actividad

    Luego inserte este código. Recuerde agregar las variables de clase privadas y CONSTANTS referenciadas en mi versión del código:

     protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intentContact = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); startActivityForResult(intentContact, PICK_CONTACT); }//onCreate public void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == PICK_CONTACT) { getContactInfo(intent); // Your class variables now have the data, so do something with it. } }//onActivityResult protected void getContactInfo(Intent intent) { Cursor cursor = managedQuery(intent.getData(), null, null, null, null); while (cursor.moveToNext()) { String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME)); String hasPhone = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)); if ( hasPhone.equalsIgnoreCase("1")) hasPhone = "true"; else hasPhone = "false" ; if (Boolean.parseBoolean(hasPhone)) { Cursor phones = 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.NUMBER)); } phones.close(); } // Find Email Addresses Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,null,ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId,null, null); while (emails.moveToNext()) { emailAddress = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); } emails.close(); Cursor address = getContentResolver().query( ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI, null, ContactsContract.CommonDataKinds.StructuredPostal.CONTACT_ID + " = " + contactId, null, null); while (address.moveToNext()) { // These are all private class variables, don't forget to create them. poBox = address.getString(address.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX)); street = address.getString(address.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET)); city = address.getString(address.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY)); state = address.getString(address.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION)); postalCode = address.getString(address.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE)); country = address.getString(address.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY)); type = address.getString(address.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE)); } //address.moveToNext() } //while (cursor.moveToNext()) cursor.close(); }//getContactInfo 

    Buscando alrededor de una solución de nivel 5 API utilizando ContactsContract API podría modificar ligeramente el código anterior con lo siguiente:

      Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(ContactsContract.Contacts.CONTENT_TYPE); startActivityForResult(intent, PICK_CONTACT); 

    Y luego en onActivityResult utilizar el nombre de la columna:

      ContactsContract.Contacts.DISPLAY_NAME 

    Aquí está el fragmento de código para obtener el contacto:

     package com.contact; import android.app.Activity; import android.content.ContentResolver; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class GetContactDemoActivity extends Activity implements OnClickListener { private Button btn = null; private TextView txt = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btn = (Button) findViewById(R.id.button1); txt = (TextView) findViewById(R.id.textView1); btn.setOnClickListener(this); } @Override public void onClick(View arg0) { if (arg0 == btn) { try { Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); startActivityForResult(intent, 1); } catch (Exception e) { e.printStackTrace(); Log.e("Error in intent : ", e.toString()); } } } @Override public void onActivityResult(int reqCode, int resultCode, Intent data) { super.onActivityResult(reqCode, resultCode, data); try { if (resultCode == Activity.RESULT_OK) { Uri contactData = data.getData(); Cursor cur = managedQuery(contactData, null, null, null, null); ContentResolver contect_resolver = getContentResolver(); if (cur.moveToFirst()) { String id = cur.getString(cur.getColumnIndexOrThrow(ContactsContract.Contacts._ID)); String name = ""; String no = ""; Cursor phoneCur = contect_resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { id }, null); if (phoneCur.moveToFirst()) { name = phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); no = phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); } Log.e("Phone no & name :***: ", name + " : " + no); txt.append(name + " : " + no + "\n"); id = null; name = null; no = null; phoneCur = null; } contect_resolver = null; cur = null; // populateContacts(); } } catch (IllegalArgumentException e) { e.printStackTrace(); Log.e("IllegalArgumentException :: ", e.toString()); } catch (Exception e) { e.printStackTrace(); Log.e("Error :: ", e.toString()); } } 

    }

      Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null); while (phones.moveToNext()) { String Name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME) String Number=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); } 
     public void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == PICK_CONTACT && intent != null) //here check whether intent is null R not { } } 

    Porque sin seleccionar ningún contacto dará una excepción. Así que mejor para comprobar esta condición.

    El código completo se da a continuación

      package com.testingContect; import android.app.Activity; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract; import android.provider.Contacts.People; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class testingContect extends Activity implements OnClickListener{ /** Called when the activity is first created. */ EditText ed; Button bt; int PICK_CONTACT; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); bt=(Button)findViewById(R.id.button1); ed =(EditText)findViewById(R.id.editText1); ed.setOnClickListener(this); bt.setOnClickListener(this); } @Override public void onClick(View v) { switch(v.getId()) { case R.id.button1: break; case R.id.editText1: Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(ContactsContract.Contacts.CONTENT_TYPE); startActivityForResult(intent, PICK_CONTACT); break; } } public void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == PICK_CONTACT) { Cursor cursor = managedQuery(intent.getData(), null, null, null, null); cursor.moveToNext(); String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME)); Toast.makeText(this, "Contect LIST = "+name, Toast.LENGTH_LONG).show(); } }//onActivityResult }//class ends 

    Para mi sorpresa, no necesitas el permiso de usuarios CONTACT_READ para leer los nombres y alguna información básica (¿El contacto está marcado con una estrella, cuál fue la última hora de llamada). Sin embargo, necesita permiso para leer los detalles del contacto como número de teléfono.

    Tenga cuidado al trabajar con la lista de contactos de Android.

    Leer la lista de contactos en los métodos anteriores funciona en la mayoría de los dispositivos Android excepto HTC One y Sony Xperia. ¡Perdí mis seis semanas tratando de averiguar qué es lo que está mal!

    La mayoría de los tutoriales disponibles en línea son casi similares – primero lea "TODOS" los contactos, luego muestre en ArrayAdapter con ArrayAdapter . Esto no es solución de memoria eficiente. En lugar de buscar soluciones en otros sitios web primero, eche un vistazo a developer.android.com. Si alguna solución no está disponible en developer.android.com debes buscar otro sitio.

    La solución es utilizar CursorAdapter lugar de ArrayAdapter para recuperar la lista de contactos. El uso de ArrayAdapter funcionaría en la mayoría de los dispositivos, pero no es eficiente. El CursorAdapter recupera sólo una parte de la lista de contactos en tiempo de ejecución mientras se está desplazando el ListView .

     public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); ... // Gets the ListView from the View list of the parent activity mContactsList = (ListView) getActivity().findViewById(R.layout.contact_list_view); // Gets a CursorAdapter mCursorAdapter = new SimpleCursorAdapter( getActivity(), R.layout.contact_list_item, null, FROM_COLUMNS, TO_IDS, 0); // Sets the adapter for the ListView mContactsList.setAdapter(mCursorAdapter); } 

    Recuperación de una lista de contactos: https://developer.android.com/training/contacts-provider/retrieve-names.html

    Estoy usando este método para leer los contactos

     public static List<ContactItem> readPhoneContacts(Context context) { List<ContactItem> contactItems = new ArrayList<ContactItem>(); try { Cursor cursor = context.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, "upper("+ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + ") ASC"); /*context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID+ " = ?", new String[] { id }, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME+" ASC");*/ Integer contactsCount = cursor.getCount(); // get how many contacts you have in your contacts list if (contactsCount > 0) { while (cursor.moveToNext()) { String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); String contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); if (Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { ContactItem contactItem = new ContactItem(); contactItem.setContactName(contactName); //the below cursor will give you details for multiple contacts Cursor pCursor = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]{id}, null); // continue till this cursor reaches to all phone numbers which are associated with a contact in the contact list while (pCursor.moveToNext()) { int phoneType = pCursor.getInt(pCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)); //String isStarred = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.STARRED)); String phoneNo = pCursor.getString(pCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); //you will get all phone numbers according to it's type as below switch case. //Logs.e will print the phone number along with the name in DDMS. you can use these details where ever you want. switch (phoneType) { case Phone.TYPE_MOBILE: contactItem.setContactNumberMobile(phoneNo); Log.e(contactName + ": TYPE_MOBILE", " " + phoneNo); break; case ContactsContract.CommonDataKinds.Phone.TYPE_HOME: contactItem.setContactNumberMobile(phoneNo); Log.e(contactName + ": TYPE_HOME", " " + phoneNo); break; case ContactsContract.CommonDataKinds.Phone.TYPE_WORK: contactItem.setContactNumberMobile(phoneNo); Log.e(contactName + ": TYPE_WORK", " " + phoneNo); break; case ContactsContract.CommonDataKinds.Phone.TYPE_WORK_MOBILE: contactItem.setContactNumberMobile(phoneNo); Log.e(contactName + ": TYPE_WORK_MOBILE", " " + phoneNo); break; case Phone.TYPE_OTHER: contactItem.setContactNumberMobile(phoneNo); Log.e(contactName + ": TYPE_OTHER", " " + phoneNo); break; default: break; } } contactItem.setSelectedAddress(getContactPostalAddress(pCursor)); pCursor.close(); contactItems.add(contactItem); } } cursor.close(); } } catch (Exception ex) { ex.printStackTrace(); } return contactItems; }//loadContacts 

    Hola tengo un código para guardar el contacto en su base de datos por preferencia compartida aquí es mi código

     public class Main22Activity extends AppCompatActivity { EditText nameInput,phoneInput; TextView LargeText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main22); nameInput = (EditText) findViewById(R.id.nameInput); phoneInput = (EditText) findViewById(R.id.phoneInput); LargeText = (TextView) findViewById(R.id.textView2); } public void saveInfo (View view){ SharedPreferences sharedPref = getSharedPreferences("nameInfo" , Context.MODE_PRIVATE); SharedPreferences.Editor editor= sharedPref.edit(); editor.putString("name", nameInput.getText().toString()); editor.putString("phone", phoneInput.getText().toString()); editor.apply(); Toast.makeText(this, "Saved", Toast.LENGTH_LONG).show(); } public void displayData(View view){ SharedPreferences sharedPref = getSharedPreferences("nameInfo" , Context.MODE_PRIVATE); String name = sharedPref.getString("name", ""); String ph = sharedPref.getString ("phone",""); LargeText.setText(name + " " + ph); } } 
     -> Add a permission to read contacts data to your application manifest. <uses-permission android:name="android.permission.READ_CONTACTS"/> -> Use Intent.Action_Pick in your Activity like below Intent contactPickerIntent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Phone.CONTENT_URI); startActivityForResult(contactPickerIntent, RESULT_PICK_CONTACT); -> Then Override the onActivityResult() @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // check whether the result is ok if (resultCode == RESULT_OK) { // Check for the request code, we might be usign multiple startActivityForReslut switch (requestCode) { case RESULT_PICK_CONTACT: Cursor cursor = null; try { String phoneNo = null ; String name = null; Uri uri = data.getData(); cursor = getContentResolver().query(uri, null, null, null, null); cursor.moveToFirst(); int phoneIndex =cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); phoneNo = cursor.getString(phoneIndex); textView2.setText(phoneNo); } catch (Exception e) { e.printStackTrace(); } break; } } else { Log.e("MainActivity", "Failed to pick contact"); } } This will work check it out 

    Utilizo el código provisto por @Colin MacKenzie – III. ¡Muchas gracias!

    Para alguien que está buscando un reemplazo de 'depreciado' managedQuery:

    1ª, suponiendo usar v4 soporte lib:

     import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; 

    2º:

     your_(activity)_class implements LoaderManager.LoaderCallbacks<Cursor> 

    3er,

     // temporarily store the 'data.getData()' from onActivityResult private Uri tmp_url; 

    4, reemplazar las devoluciones de llamada:

     @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { // create the loader here! CursorLoader cursorLoader = new CursorLoader(this, tmp_url, null, null, null, null); return cursorLoader; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { getContactInfo(cursor); // here it is! } @Override public void onLoaderReset(Loader<Cursor> loader) { } 

    5º:

     public void initLoader(Uri data){ // will be used in onCreateLoader callback this.tmp_url = data; // 'this' is an Activity instance, implementing those callbacks this.getSupportLoaderManager().initLoader(0, null, this); } 

    6, el código anterior , excepto que cambio el param de firma de Intent to Cursor:

     protected void getContactInfo(Cursor cursor) { // Cursor cursor = managedQuery(intent.getData(), null, null, null, null); while (cursor.moveToNext()) { // same above ... } 

    7, llame a initLoader:

     @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (PICK_CONTACT == requestCode) { this.initLoader(data.getData(), this); } } 

    8, no se olvide de este pedazo de código

      Intent intentContact = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); this.act.startActivityForResult(intentContact, PICK_CONTACT); 

    Referencias:

    Principios básicos de Android: correctamente cargando datos

    Inicialización de un cargador en una actividad

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.