2011-09-25 11 views
9

Estoy tratando de lanzar la actividad nativa de Android "agregar o editar contacto" con algunos datos que ya están en el formulario. Este es el código que estoy usando actualmente:Cómo agregar un contacto con nombre y apellido a través del intento

Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT); 
intent.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE); 

intent.putExtra(Insert.NAME, "A name"); 
intent.putExtra(Insert.PHONE, "123456789"); 
startActivity(intent); 

Mi problema es que me gustaría especificar un nombre y un apellido. También noté que hay una clase StructuredName que contiene identificadores constantes para todos los campos que requiero. Desafortunadamente, no pude agregar los campos StructuredName a la intención ...

¿Alguien sabe cómo se hace esto correctamente?

Nota: No estoy intentando agregar el contacto directamente, pero quiero abrir un cuadro de diálogo "agregar contacto" lleno.

Gracias Duh

Respuesta

2

mayoría/todos los valores de ContactsContract.Intents.Insert se procesan en la clase model/EntityModifier.java en la aplicación de contactos por defecto - y que acaba de stuffs el valor de Insert.NAME en StructuredName.GIVEN_NAME.

Puede intentar importarlo como una vCard 2.1 (texto/x-vcard), que admite todos los componentes de nombre pero requiere que descargue su archivo vCard en la tarjeta sd o suministre algo que ContentResolver#openInputStream(Uri) puede leer (generalmente un archivo en la tarjeta SD o un URI que apunta a su propio ContentProvider).

Un ejemplo simple que utiliza un ContentProvider para crear las tarjetas virtuales de forma dinámica:

En su Actividad:

Intent i = new Intent(Intent.ACTION_VIEW); 
i.setDataAndType(Uri.parse("content://some.authority/N:Jones;Bob\nTEL:123456790\n"), "text/x-vcard"); 
startActivity(i); 

En su ContentProvider (registrados por la autoridad usada en la Intención ACTION_VIEW):

public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { 
    try { 
    FileOutputStream fos = getContext().openFileOutput("filename.txt", Context.MODE_PRIVATE); 
    String vcard = "BEGIN:VCARD\nVERSION:2.1\n" + 
     uri.getPath().substring(1) + 
     "END:VCARD\n"; 
    fos.write(vcard.getBytes("UTF-8")); 
    fos.close(); 
    return ParcelFileDescriptor.open(new File(getContext().getFilesDir(), "filename.txt"), ParcelFileDescriptor.MODE_READ_ONLY); 
    } catch (IOException e) { 
    throw new FileNotFoundException(); 
    } 
} 

Esto debería, cuando se activa, insertar un contacto llamado lo que sea que haya puesto en la ruta de su Uri en la guía telefónica. Si el usuario tiene varias cuentas de contactos, se le pedirá que seleccione una.

Nota: Por supuesto, la codificación correcta de la vCard se ignora por completo. Imagen de la mayoría de las versiones de la aplicación de contactos debe admitir vCard 3.0 también que no tiene la codificación cerebral como vCard 2.1.

En la parte superior, este método también le permitirá agregar trabajo/móvil y otros números (y más).

+0

Oh complemento. También notó que quería editar el maldito objeto; en la mayoría de los casos, solo agregará el contacto y, si define el nombre y el tipo de cuenta, ni siquiera le pedirá confirmación al usuario (gran agujero de seguridad, como siempre). – Jens

+0

Gracias por la respuesta Jens. Es un enfoque interesante (aunque hacky) de hecho. ¿Podría haber una manera de pasar la vcard (en una capa de abstracción) a la intención con ACTION_INSERT_OR_EDIT? – Dino

+0

No es que yo sepa, el intento ACTION_INSERT_OR_EDIT es bastante limitado en lo que admite en la aplicación de contactos predeterminada. – Jens

Cuestiones relacionadas