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).
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
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
Non che ne sia a conoscenza: l'intento ACTION_INSERT_OR_EDIT è piuttosto limitato in ciò che supporta nell'app dei contatti predefinita. – Jens