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.
- Cómo mostrar personalizado tipo contacto dentro de Contacto como WhatsApp android
- ContentObserver para actualización de contacto manualmente
- Cómo proteger los contactos de mi aplicación como Facebook
- ¿Cómo transmitir un contacto desde su aplicación (usando NFC) y guardarlo en la lista de contactos en el dispositivo receptor?
- Obtención de un cursor SINGLE con detalles de nombre completo y números de teléfono
¿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; }}
- Android API 8, 10 ContactsContract.Data.HAS_PHONE_NUMBER ninguna columna
- ¿Cuál es el tipo / nombre de cuenta predeterminado para contactos en la aplicación de contacto de Android?
- Leer todos los datos de contacto
- ¿Cómo obtener el ID de Facebook de un usuario a través de la API de ContactsContracts?
- Obtener el perfil de usuario / propietario de contacto URI y la imagen de usuario con API 8 en adelante
- No se puede insertar los contactos de android mediante programación en el dispositivo de Android
- Obtener el nombre y el apellido de un contacto en lugar de un solo nombre para mostrar?
- Android: obtener todos los contactos de la libreta de direcciones local
@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"/>
- ¿Hay algún DLL o DLL como concepto en Android?
- RxJava / Retrofit – ¿Cómo puedo obligar a los usuarios a usar una subclase específica de suscriptor?