telefonicos mis importar guardar guardados google exportar descargar contactos como celular android contacts

mis - ¿Cómo puedo elegir un número de teléfono con el diálogo de contactos de Android?



gmail contactos (4)

Aquí puede encontrar un gran código de: http://developer.android.com/training/basics/intents/result.html

static final int PICK_CONTACT_REQUEST = 1; // The request code ... private void pickContact() { Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts")); pickContactIntent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // Check which request it is that we''re responding to if (requestCode == PICK_CONTACT_REQUEST) { // Make sure the request was successful if (resultCode == RESULT_OK) { // Get the URI that points to the selected contact Uri contactUri = data.getData(); // We only need the NUMBER column, because there will be only one row in the result String[] projection = {Phone.NUMBER}; // Perform the query on the contact to get the NUMBER column // We don''t need a selection or sort order (there''s only one result for the given URI) // CAUTION: The query() method should be called from a separate thread to avoid blocking // your app''s UI thread. (For simplicity of the sample, this code doesn''t do that.) // Consider using CursorLoader to perform the query. Cursor cursor = getContentResolver() .query(contactUri, projection, null, null, null); cursor.moveToFirst(); // Retrieve the phone number from the NUMBER column int column = cursor.getColumnIndex(Phone.NUMBER); String number = cursor.getString(column); // Do something with the phone number... } } }

Estoy usando la antigua API de contactos para elegir un contacto con un número de teléfono. Quiero usar la nueva API ContactsContracts. Quiero...

  1. ... se muestra un cuadro de diálogo con todos los contactos que tienen números de teléfono.
  2. ... el usuario elige un contacto Y uno de sus números de teléfono.
  3. ... acceso al número de teléfono elegido.

Los Contratos de Contactos es muy complicado. He encontrado muchos ejemplos, pero ninguno que se ajuste a mis necesidades. No quiero elegir un contacto y luego consultar los detalles del contacto porque esto me dará una lista de sus números de teléfono. Necesito que el usuario elija UNO de los números de teléfono del contacto. No quiero tener que escribir mis propios diálogos para mostrar los contactos o para que el usuario elija un número de teléfono. ¿Hay alguna forma sencilla de conseguir lo que quiero?

Aquí está el viejo código API que estoy usando:

static public final int CONTACT = 0; ... Intent intent = new Intent(Intent.ACTION_PICK, Contacts.Phones.CONTENT_URI); startActivityForResult(intent, CONTACT); ... public void onActivityResult (int requestCode, int resultCode, Intent intent) { if (resultCode != Activity.RESULT_OK || requestCode != CONTACT) return; Cursor c = managedQuery(intent.getData(), null, null, null, null); if (c.moveToFirst()) { String phone = c.getString(c.getColumnIndexOrThrow(Contacts.Phones.NUMBER)); // yay } }


De las respuestas anteriores y mis propias pruebas, terminé usando esto:

lanzamiento de la lista de contactos:

import android.content.Intent; import android.provider.ContactsContract; import android.provider.ContactsContract.CommonDataKinds.Phone;

...

public static final int PICK_CONTACT = 100;

...

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); intent.setType(Phone.CONTENT_TYPE); //should filter only contacts with phone numbers startActivityForResult(intent, PICK_CONTACT);

onActivityResult handler:

private static final String[] phoneProjection = new String[] { Phone.DATA }; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (PICK_CONTACT != requestCode || RESULT_OK != resultCode) return; Uri contactUri = data.getData(); if (null == contactUri) return; //no tampering with Uri makes this to work without READ_CONTACTS permission Cursor cursor = getContentResolver().query(contactUri, phoneProjection, null, null, null); if (null == cursor) return; try { while (cursor.moveToNext()) { String number = cursor.getString(0); // ... use "number" as you wish } } finally { cursor.close(); } // "cursor" is closed here already }

Entonces, ¿cuáles son las diferencias de respuesta de Rizvan?

En mi dispositivo de prueba (Samsung S3):

  • la aplicación NO necesita el permiso READ_CONTACS (porque uso el uri devuelto tal como está, cuando uso solo el "id" de la misma y creo el tipo de consulta READ_CONTACS ID =?, se produce el bloqueo del permiso)
  • cuando el contacto tiene varios números de teléfono, el selector sí muestra el diálogo para seleccionar solo uno de ellos, luego devuelve uri que lleva directamente a ese único número seleccionado
  • incluso si algún teléfono devuelve el uri a varios números, el controlador onActivityResult propuesto se puede extender para leerlos todos y usted puede hacer su propio diálogo de selección.

Así que esto me parece perfecto para lo que pidió OP.

Ahora me pregunto:

  1. en qué teléfonos esto requerirá el permiso READ_CONTACTS (no debería, según http://developer.android.com/guide/topics/providers/content-provider-basics.html#Intents )
  2. En qué teléfonos devolverá varios números en lugar de hacer el diálogo de selección

Déjame saber si tienes experiencia en el mundo real, gracias.

Actualización: HTC Desire S, rom personalizada con Android 4.0.3 -> tiene ambos problemas, requiere el permiso READ_CONTACTS para funcionar, y devolverá varios números sin un diálogo de selección adicional.


Encuentro una forma de elegir exactamente el número de teléfono de la lista de contactos. A continuación se muestra el fragmento.

1. Lanzar contactos para seleccionar números de teléfono en el fragmento.

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); // filter the contacts with phone number only intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE); startActivityForResult(intent, PICK_CONTACT);

2. Seleccione los números de teléfono seleccionados en el fragmento.

@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case (PICK_CONTACT): if (resultCode == Activity.RESULT_OK) { Uri contactData = data.getData(); Cursor cur = getActivity().getContentResolver().query(contactData, null, null, null, null); if (cur == null) return; try { if (cur.moveToFirst()) { int phoneIndex = cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); mobileNoEditText.setText(cur.getString(phoneIndex)); } } finally { cur.close(); } } } }

PS private final int PICK_CONTACT = 666;


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

Este código podría ayudarte. Creo que la acción PICK solo devuelve el ID del contacto seleccionado. Desde allí, puede consultar al proveedor de contacto y si hay varios números de teléfono, solicite al usuario que seleccione uno de ellos.

Puedes usar esto también (actualizado):

public void readcontact(){ try { Intent intent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts/people")); startActivityForResult(intent, PICK_CONTACT); } catch (Exception e) { e.printStackTrace(); } } 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 = managedQuery(contactData, null, null, null, null); startManagingCursor(c); if (c.moveToFirst()) { String name = c.getString(c.getColumnIndexOrThrow(People.NAME)); String number = c.getString(c.getColumnIndexOrThrow(People.NUMBER)); personname.setText(name); Toast.makeText(this, name + " has number " + number, Toast.LENGTH_LONG).show(); } } break; } }

Actualizado 28/12 -2011

Puedes usar esto:

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

Necesita adaptar esto para trabajar con su aplicación.