Android中如何共享未保存的联系人信息?
实现联系人信息的分享Intent方案
我开发了一款可扫描联系人信息的二维码扫描应用,用户扫描后可添加联系人或共享该信息。我已实现添加联系人的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 }
注:已修正原代码中的语法错误(Put改为put、Add改为add、箭头-改为->)
这段代码运行正常,但我该如何通过分享Intent来共享这些联系人信息?
要实现联系人信息共享,核心是把联系人数据转换成通用的vCard格式(几乎所有支持联系人交换的应用都兼容),再通过分享Intent发送。
1. 把联系人数据转成vCard字符串
先写个方法,将你的联系人字段拼接成标准vCard内容:
fun buildVCard( name: String, phones: Map<Int, String>, emails: Map<Int, String>, jobTitle: String, organization: String, addresses: List<String>, urls: List<String> ): String { val vCard = StringBuilder().apply { append("BEGIN:VCARD\n") append("VERSION:3.0\n") append("FN:$name\n") // 全名 if (jobTitle.isNotEmpty()) append("TITLE:$jobTitle\n") if (organization.isNotEmpty()) append("ORG:$organization\n") // 处理电话号码,映射vCard标准类型 phones.forEach { (type, number) -> val typeStr = when(type) { ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE -> "CELL" ContactsContract.CommonDataKinds.Phone.TYPE_WORK -> "WORK" ContactsContract.CommonDataKinds.Phone.TYPE_HOME -> "HOME" else -> "OTHER" } append("TEL;TYPE=$typeStr:$number\n") } // 处理邮箱,映射vCard标准类型 emails.forEach { (type, address) -> val typeStr = when(type) { ContactsContract.CommonDataKinds.Email.TYPE_WORK -> "WORK" ContactsContract.CommonDataKinds.Email.TYPE_HOME -> "HOME" else -> "OTHER" } append("EMAIL;TYPE=$typeStr:$address\n") } // 处理地址(简化格式,如需细分可拆分为街道、城市等字段) addresses.forEach { addr -> append("ADR;TYPE=HOME:;;$addr;;;;\n") } // 处理网址 urls.forEach { url -> append("URL:$url\n") } append("END:VCARD") } return vCard.toString() }
2. 创建分享Intent
有了vCard字符串后,构建分享Intent并指定正确的MIME类型:
fun createShareContactIntent(vCardContent: String): Intent { return Intent(Intent.ACTION_SEND).apply { type = "text/vcard" putExtra(Intent.EXTRA_TEXT, vCardContent) putExtra(Intent.EXTRA_SUBJECT, "分享联系人信息") flags = Intent.FLAG_ACTIVITY_NEW_TASK } }
3. 调用分享功能
在业务逻辑里生成vCard并启动分享:
// 假设已获取到联系人各字段数据 val vCard = buildVCard(name, phones, emails, jobTitle, organization, addresses, urls) val shareIntent = createShareContactIntent(vCard) startActivity(Intent.createChooser(shareIntent, "选择分享方式"))
关键说明
- vCard 3.0兼容性最好,大部分应用都支持;
- 电话、邮箱的类型要对应vCard标准字段,确保接收方能正确识别;
- MIME类型必须设为
text/vcard,系统才会筛选出支持联系人分享的应用; - 使用
Intent.createChooser可以强制弹出应用选择器,避免直接跳转默认应用。
内容的提问来源于stack exchange,提问作者nope
相关产品推荐
相关产品推荐

