2011-09-25 20 views
9

Sto tentando di avviare l'attività Android "aggiungi o modifica contatto" con alcuni dati già presenti nel modulo. Questo è il codice che sto usando attualmente:Come aggiungere un contatto con nome e cognome via intent

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); 

Il mio problema è che vorrei specificare un nome e un cognome. Ho anche notato che esiste una classe StructuredName che contiene identificatori costanti per tutti i campi che richiedo. Purtroppo, non sono riuscito ad aggiungere i campi StructuredName all'intenzione ...

Qualcuno sa come questo è fatto correttamente?

Nota: non sto tentando di aggiungere direttamente il contatto, ma desidero aprire una finestra di dialogo "aggiungi contatto" popolata!

Grazie Duh

risposta

2

maggior parte/tutti i valori da ContactsContract.Intents.Insert vengono elaborati nella classe model/EntityModifier.java nell'applicazione dei contatti predefiniti - e che solo infila il valore da Insert.NAME in StructuredName.GIVEN_NAME.

Si potrebbe provare a importarlo come una vCard 2.1 (testo/x-vcard), che supporta tutti i componenti del nome ma richiede che si scarichi il file vCard sulla sdcard o fornisca qualcosa che ContentResolver#openInputStream(Uri) possa leggere (tipicamente un file sulla sdcard o un URI che punta al proprio ContentProvider).

Un semplice esempio che utilizza una ContentProvider per creare le vCard dinamicamente:

nella vostra attività:

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); 

Nella tua ContentProvider (registrati per l'autorità utilizzato nel Intent 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(); 
    } 
} 

Questo dovrebbe, quando attivato, inserire un contatto chiamato qualunque cosa si metta nel percorso del proprio Uri nella rubrica. Se l'utente ha diversi account di contatti, gli verrà chiesto di selezionarne uno.

Nota: La corretta codifica della vCard è ovviamente completamente ignorata. Immagino la maggior parte delle versioni dell'app dei contatti dovrebbe supportare vCard 3.0 che non ha codifica abbastanza cerebrale come vCard 2.1.

Sul lato superiore, questo metodo consente anche di aggiungere lavoro/cellulare e altri numeri (e altro).

+0

Oh scatto. Ho notato che volevi modificare anche quella dannata cosa - nella maggior parte dei casi basta aggiungere il contatto - e se definisci il nome e il tipo di account - non chiedere nemmeno all'utente conferma (enorme buco di sicurezza come al solito). – Jens

+0

Grazie per la risposta Jens. È un approccio interessante (anche se hacky). Potrebbe esserci un modo per passare la vcard (su qualche livello di astrazione) all'intento con ACTION_INSERT_OR_EDIT? – Dino

+0

Non che ne sia a conoscenza: l'intento ACTION_INSERT_OR_EDIT è piuttosto limitato in ciò che supporta nell'app dei contatti predefinita. – Jens

Problemi correlati