2011-05-27 24 views
5

Estoy tratando de obtener el nombre y el número de teléfono de un contacto después de que un usuario haya elegido un contacto del selector de contactos. Intento que mi aplicación funcione para SDK v3 y superior, así que creé una clase abstracta que llamaría solo la API que necesitaba. Ya tengo la clase abstracta trabajando (elige la API correcta) y también tengo la API para SDK v3,4 en funcionamiento. Tengo problemas para que funcione la API más nueva que usa ContactsContract.Obtener el número del selector de contactos

Puedo obtener un nombre de contacto, pero el número que recupera siempre es el número de la ID de contacto ¡ANTES! Ejemplo: Tengo 2 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 obtener el número de Jane Doe, obtengo el de John, 555-555-5555. Si intento obtener el de John, no obtengo nada. La comprobación de if (cursor.moveToNext()) falla.

¿Me pueden ayudar a solucionar esto? Me vuelve loco. He visto muchos ejemplos y siempre obtengo el mismo error.

Los datos Intención es la intención datos 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 (Activity a, Intent data) { 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)); String hasPhoneNumber = cursor.getString(cursor.getColumnIndexOrThrow( ContactsContract.Contacts.HAS_PHONE_NUMBER)); info.add(name); 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(number); } } } return info; } }

Respuesta

23
@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 
    } 
} 

Es necesario adaptar este a trabajar con su aplicación

+0

Muchas gracias. Tu código era diferente de todo lo demás que he encontrado y funcionó muy bien. Además, su código para seleccionar qué número es extremadamente útil. – user543010

+0

Funciona como un encanto. Me olvidé de agregar el permiso READ_CONTACTS y, por lo tanto, no funcionó al principio, pero luego fue lo mejor que encontré para elegir un contacto. Gracias. :) – buggydroid

+0

¿Qué es CONTACT_PICKER_RESULT? No pude hacerlo. – DuyguK

4

que dint conseguir ese caso la línea CONTACT_PICKER_RESULT ... la código que utilicé arriba usando esto

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; 

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

Este código te ayuda, creo que la actividad PICK solo devuelve la identificación del contacto elegido. Desde allí, puede consultar al proveedor de contactos y si hay varios números de teléfono, solicite al usuario que seleccione uno de ellos.

U puede utilizar 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 
} 
} 
+0

donde tengo que poner esto 'findViewById (R.id.phoneNumberInput)' @Sathish –

+0

donde sea que pueda con el método onCreate(). – Sathish

3

Nota buena para los principiantes, No se olvide de incluir el siguiente permiso o de lo contrario no lo puedo trabajar

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

Cuestiones relacionadas