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...
- ... se muestra un cuadro de diálogo con todos los contactos que tienen números de teléfono.
- ... el usuario elige un contacto Y uno de sus números de teléfono.
- ... 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 eluri
devuelto tal como está, cuando uso solo el "id" de la misma y creo el tipo de consultaREAD_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:
- 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 ) - 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.