Context: I have a QR scanner app that can scan contacts info. upon scanned, the user can add the contact or share it. how can I share (if I can) to another app?
I have this code right here to add contact intent:
fun createContactIntent(
name: String,
phones: Map<Int, String>,
emails: Map<Int, String>,
jobTitle: String,
organization: String,
addresses: List<String>,
urls: List<String>
): Intent {
val data = ArrayList<ContentValues>()
val intent = Intent(ContactsContract.Intents.Insert.ACTION).apply {
type = ContactsContract.Contacts.CONTENT_TYPE
putExtra(ContactsContract.Intents.Insert.NAME, name)
putExtra(ContactsContract.Intents.Insert.JOB_TITLE, jobTitle)
putExtra(ContactsContract.Intents.Insert.COMPANY, organization)
}
addresses.forEach {
val row = ContentValues()
row. Put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE)
row. Put(ContactsContract.CommonDataKinds.SipAddress.SIP_ADDRESS, it)
data. Add(row)
}
urls.forEach {
val row = ContentValues()
row. Put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE)
row. Put(ContactsContract.CommonDataKinds.Website.URL, it)
data. Add(row)
}
emails.forEach{ (type, address) ->
val row = ContentValues()
row. Put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
row. Put(ContactsContract.CommonDataKinds.Email.ADDRESS, address)
row. Put(ContactsContract.CommonDataKinds.Email.TYPE, type)
data. Add(row)
}
phones.forEach { (type, phone) ->
val row = ContentValues()
row. Put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
row. Put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone)
row. Put(ContactsContract.CommonDataKinds.Phone.TYPE, type)
data. Add(row)
}
intent.putParcelableArrayListExtra(ContactsContract.Intents.Insert.DATA, data)
return intent
}
And it works great, but how can i share the contact info via share intent?
When it comes to sharing a contact's information that doesn't exist in the phone's contact list, one way to achieve this is by sending a vCard (Virtual Contact File) using Android's sharing intent. The vCard format (.vcf file) is a universally accepted format for sharing contacts.
The steps involved are:
Here's a brief solution to share a contact's information using a vCard:
fun shareContact(
name: String,
phones: Map<Int, String>,
emails: Map<Int, String>,
jobTitle: String,
organization: String,
addresses: List<String>,
urls: List<String>
) {
// Create vCard
val vCard = StringBuilder()
vCard.append("BEGIN:VCARD\n")
vCard.append("VERSION:3.0\n")
vCard.append("FN:$name\n")
vCard.append("ORG:$organization\n")
vCard.append("TITLE:$jobTitle\n")
phones.forEach { (_, phone) ->
vCard.append("TEL:$phone\n")
}
emails.forEach { (_, email) ->
vCard.append("EMAIL:$email\n")
}
addresses.forEach { address ->
vCard.append("ADR:;;$address\n")
}
urls.forEach { url ->
vCard.append("URL:$url\n")
}
vCard.append("END:VCARD\n")
// Share vCard
val shareIntent = Intent().apply {
action = Intent.ACTION_SEND
type = "text/x-vcard"
putExtra(Intent.EXTRA_TEXT, vCard.toString())
}
// Start the share intent
startActivity(Intent.createChooser(shareIntent, "Share contact using"))
}
Here, the shareContact function constructs a vCard string with the provided contact details and then uses a sharing intent to send this vCard to other apps. The receiving app can then interpret the vCard to get the contact details.
Note: This is a basic example. The vCard format can be more complex, supporting many different fields and properties. Make sure to test this across devices to ensure compatibility. Also, for better performance with larger data, you might consider using StringBuffer instead of StringBuilder.