2010-11-25 32 views
13

¿Es posible abrir una tarjeta de contacto de Android por ID de contacto? Funciona con el número de teléfono. He aquí un ejemplo, si usoCómo abrir una tarjeta de contacto en Android con ID

Intent i = new Intent(); 
i.setAction(ContactsContract.Intents.SHOW_OR_CREATE_CONTACT); 
i.setData(Uri.fromParts("tel", "123456", null)); //<---- Change here from Phone to IDcontext.startActivity(i); 

Pero quiero abrir esta tarjeta de contacto por ID, por ejemplo, si el teléfono-número del contacto cambiaría.

Respuesta

40

use ACTION_VIEW y construya un URI de contacto usando la ID de contacto o use el URI de búsqueda de contacto si ya lo tiene (preferido).

Intent intent = new Intent(Intent.ACTION_VIEW); 
    Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(contactID)); 
    intent.setData(uri); 
context.startActivity(intent); 
+1

Gracias por su respuesta, era exactamente lo que estaba buscando. –

+4

Como nota al margen: no se recomienda seleccionar contactos por 'id', porque no está garantizado que no cambie. De hecho, las posibilidades son muy altas de que la identificación * VOLVERÁ a cambiar. Deberías usar la solución de jhominal y recogerla con LOOKUP_URI, porque la clave de búsqueda siempre permanece igual. Antecedentes: el 'ID' se puede cambiar durante las sincronizaciones, por lo que no dependa de él o su aplicación se puede romper en cualquier momento en el futuro durante o después de una sincronización de la lista de contactos – Tseng

+0

Guau, obviamente, pasó por alto el significado de" id ". Gracias Tseng, lo cambiaré en mi código y lo recordaré por la próxima vez :) –

4

se usaría el siguiente URI:

Uri.Builder newUriBuilder = ContactsContract.Contacts.CONTENT_LOOKUP_URI.buildUpon(); 
newUriBuilder.appendPath("/").appendPath(theContactKey) 
i.setData(newUriBuilder.build()); 

podrás encontrar más detalles acerca de cómo funciona este URI mirando el API documentation for CONTENT_LOOKUP_URI.

+5

Ok, gracias a que jhominal para señalar en la dirección correcta, pero tu respuesta no fue del todo correcta. Aquí está la solución correcta: Uri look = Uri.withAppendedPath (Contacts.CONTENT_LOOKUP_URI, here The LookUpKey); Intención i = nueva intención (Intent.ACTION_VIEW); i.setData (mirar); –

+0

no está utilizando este URI mejor: Contacts.getLookupUri (contactId, lookupKey)? –

2

yo estaba tratando de abrir una tarjeta de contacto utilizando los métodos enumerados aquí, pero de alguna manera la actividad estaba cerrando los contactos inmediatamente después de que se estaba abriendo.

parecía que la actividad de contacto no aceptaba mi contenido antiguo uri.

que resuelven este problema utilizando el método de ContactsContract.Contacts clase getLookupUri (long contactId, String lookupKey) para obtener el contenido uri derecho https://developer.android.com/reference/android/provider/ContactsContract.Contacts.html#getLookupUri(long, java.lang.String)

Así que el código para abrir una tarjeta de contacto se convierte en:

Intent intent = new Intent(Intent.ACTION_VIEW); 
String lookupKey = phonesCursor.getString(phonesCursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup.LOOKUP_KEY)); 
long contactId = phonesCursor.getLong(phonesCursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup._ID)); 
Uri uri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey); 
intent.setData(uri); 
startActivity(intent); 
Cuestiones relacionadas