Obtener número del selector de contactos

Estoy tratando de obtener un nombre de contactos y un número de teléfono después de que un usuario haya seleccionado un contacto de la Selector de contactos. Estoy intentando hacer mi trabajo de la aplicación para SDK v3 y para arriba así que creé una clase abstracta que llamaría solamente la API que necesitaba. Ya tengo la clase abstracta trabajando (elige la API correcta) y también tengo la API para SDK v3.4 trabajando. Tengo problemas para obtener la API más nueva que utiliza ContactsContract para trabajar.

Puedo conseguir un nombre de los contactos, pero el número que él recupera es siempre el número para la identificación del contacto ANTES de él! Ejemplo: Tengo dos contactos "John Doe" y "Jane Doe" con los números respectivos "555-555-555" y "777-777-7777" agregados en los contactos. John Doe es ID = 1 y Jane Doe es ID = 2. Si intento conseguir el número de Jane Doe, obtendré John's, 555-555-5555. Si intento conseguir a John, no consigo nada. La comprobación de si (cursor.moveToNext ()) falla.

¿Puedes ayudarme a arreglar esto? Me vuelve loco. He mirado muchos muchos ejemplos y siempre obtengo el mismo error.

Los datos de intención son los datos de intención de la onActivityResult

 import java.util.ArrayList; 

Import android.app.Activity; Import android.content.Intent; Import android.database.Cursor; Import android.net.Uri; Import android.provider.ContactsContract; Import android.provider.ContactsContract.CommonDataKinds.Email; Import android.provider.ContactsContract.CommonDataKinds.Phone; Import android.provider.ContactsContract.Contacts;

Class NewContactsAdapterBridge extends ContactsAdapterBridge {

ArrayList <String> info = new ArrayList <String> (); ArrayList <String> getInfo (Actividad a, Datos de intención) {Uri contactData = data.getData (); Cursor cursor = a.managedQuery (contactData, null, null, null, null); If (cursor.moveToFirst ()) {String id = cursor.getString (cursor.getColumnIndex (ContactsContract.Contacts._ID)); String name = cursor.getString (cursor.getColumnIndexOrThrow (ContactsContract.Contacts.DISPLAY_NAME)); Cadena hasPhoneNumber = cursor.getString (cursor.getColumnIndexOrThrow (ContactsContract.Contacts.HAS_PHONE_NUMBER)); Info.add (nombre); If (Integer.parseInt (hasPhoneNumber)> 0) {Uri myPhoneUri = Uri.withAppendedPath (ContactsContract.CommonDataKinds.Phone.CONTENT_URI, id); Cursor pCur = a.managedQuery (myPhoneUri, null, null, null, null); If (pCur.moveToNext ()) {String number = pCur.getString (pCur.getColumnIndex (ContactsContract.CommonDataKinds.Phone.NUMBER)); Info.add (número); }}} Return info; }}

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { switch (requestCode) { case CONTACT_PICKER_RESULT: final EditText phoneInput = (EditText) findViewById(R.id.phoneNumberInput); Cursor cursor = null; String phoneNumber = ""; List<String> allNumbers = new ArrayList<String>(); int phoneIdx = 0; try { Uri result = data.getData(); String id = result.getLastPathSegment(); cursor = getContentResolver().query(Phone.CONTENT_URI, null, Phone.CONTACT_ID + "=?", new String[] { id }, null); phoneIdx = cursor.getColumnIndex(Phone.DATA); if (cursor.moveToFirst()) { while (cursor.isAfterLast() == false) { phoneNumber = cursor.getString(phoneIdx); allNumbers.add(phoneNumber); cursor.moveToNext(); } } else { //no results actions } } catch (Exception e) { //error actions } finally { if (cursor != null) { cursor.close(); } final CharSequence[] items = allNumbers.toArray(new String[allNumbers.size()]); AlertDialog.Builder builder = new AlertDialog.Builder(your_class.this); builder.setTitle("Choose a number"); builder.setItems(items, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { String selectedNumber = items[item].toString(); selectedNumber = selectedNumber.replace("-", ""); phoneInput.setText(selectedNumber); } }); AlertDialog alert = builder.create(); if(allNumbers.size() > 1) { alert.show(); } else { String selectedNumber = phoneNumber.toString(); selectedNumber = selectedNumber.replace("-", ""); phoneInput.setText(selectedNumber); } if (phoneNumber.length() == 0) { //no numbers found actions } } break; } } else { //activity result error actions } } 

Debe adaptarlo para que funcione con su aplicación

I dint obtener ese caso de línea CONTACTO_PICKER_RESULT … el código que he utilizado anteriormente con este

 int PICK_CONTACT; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); b=(Button) findViewById(R.id.button1); et=(EditText) findViewById(R.id.editText1); b.setOnClickListener(this); //et.setOnClickListener(this); } @Override public void onClick(View v) { switch(v.getId()) { case R.id.button1: Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(ContactsContract.Contacts.CONTENT_TYPE); startActivityForResult(intent, PICK_CONTACT); break; // case R.id.editText1: // break; } 
  Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(ContactsContract.Contacts.CONTENT_TYPE); startActivityForResult(intent, PICK_CONTACT); 

Este código ayuda u, creo que la actividad PICK sólo devuelve el ID del contacto seleccionado. A partir de eso, puede consultar el proveedor de contactos y si hay varios números de teléfono, pida al usuario que seleccione uno de ellos.

U puede usar esto también

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { switch (requestCode) { case CONTACT_PICKER_RESULT: final EditText phoneInput = (EditText) findViewById(R.id.phoneNumberInput); Cursor cursor = null; String phoneNumber = ""; List<String> allNumbers = new ArrayList<String>(); int phoneIdx = 0; try { Uri result = data.getData(); String id = result.getLastPathSegment(); cursor = getContentResolver().query(Phone.CONTENT_URI, null, Phone.CONTACT_ID + "=?", new String[] { id }, null); phoneIdx = cursor.getColumnIndex(Phone.DATA); if (cursor.moveToFirst()) { while (cursor.isAfterLast() == false) { phoneNumber = cursor.getString(phoneIdx); allNumbers.add(phoneNumber); cursor.moveToNext(); } } else { //no results actions } } catch (Exception e) { //error actions } finally { if (cursor != null) { cursor.close(); } final CharSequence[] items = allNumbers.toArray(new String[allNumbers.size()]); AlertDialog.Builder builder = new AlertDialog.Builder(your_class.this); builder.setTitle("Choose a number"); builder.setItems(items, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { String selectedNumber = items[item].toString(); selectedNumber = selectedNumber.replace("-", ""); phoneInput.setText(selectedNumber); } }); AlertDialog alert = builder.create(); if(allNumbers.size() > 1) { alert.show(); } else { String selectedNumber = phoneNumber.toString(); selectedNumber = selectedNumber.replace("-", ""); phoneInput.setText(selectedNumber); } if (phoneNumber.length() == 0) { //no numbers found actions } } break; } } else { //activity result error actions } } 

Nota amable para los principiantes, No se olvide de incluir el siguiente permiso o de lo contrario no funcionará

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

  • Android Contacts.CONTENT_STREQUENT_URI lanza SQLiteException en Android 4.1.2 y 4.4.2
  • Cómo actualizar sólo los contactos en lugar de agregar en el adaptador de sincronización
  • Crear grupo de contactos invisibles en Android
  • Cargando la imagen de contacto a través de LOOKUP_KEY y método de conveniencia openContactPhotoInputStream
  • Cómo crear un contacto programáticamente
  • ¿Cómo funcionan las columnas unidas implícitas con los datos de los contactos de Android?
  • Consulta de contacto Android para obtener ACCOUNT_TYPE y ACCOUNT_NAME
  • Insertar contacto en Android con ContactsContract
  • Android editar contacto
  • Foto de contacto de Android: Cómo volver a (Google) foto de contacto de la web (y así, 'cancelar' un cambio de imagen local anterior)
  • Telephony.Sms.Inbox.PERSON utiliza Contacts.People._ID obsoletos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.