You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 13:05:24