CreateContactTool
Creates a contact with one ContactsContract batch: a RawContacts row in the local device account (null account name/type), a StructuredName row from name, and optional Phone and Email rows. Requires WRITE_CONTACTS (plus READ_CONTACTS to look up the aggregated id).
phone must use digits and dialler punctuation (3-20 digits); email must look like local@domain.tld. phone_type (mobile/home/work/other, default mobile) and email_type (home/work/other, default home) are case-insensitive. Some devices route new contacts to a cloud default account or refuse local-account inserts; the provider's error is returned as-is.
Output: contact_id (the aggregated contact id usable with read_contact; null if the provider hasn't aggregated the raw contact yet), raw_contact_id, and the echoed name, phone and email (null when not given).