背景:我有一个二维码 scanner 应用程序,可以扫描联系人信息.扫描后,用户可以添加或共享联系人.我如何(如果可以)共享到另一个应用程序?

我在这里有这个代码来添加联系意图:

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
}

它工作得很好,但我如何通过共享意向共享联系信息?

推荐答案

当涉及到共享手机联系人列表中不存在的联系人信息时,一种方法是使用Android的共享意图发送vCard(虚拟联系人文件).VCard格式(.vcf文件)是共享联系人的一种普遍接受的格式.

涉及的步骤包括:

  1. 根据联系信息创建Electron 名片字符串.
  2. 使用Android的Intent系统来共享此vCard字符串.

以下是使用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"))
}

在这里,SharContact函数使用提供的联系人详细信息构造一个vCard字符串,然后使用共享意图将该vCard发送到其他应用程序.然后,接收应用程序可以解释vCard以获取联系方式详细信息.

注意:这是一个基本的例子.VCard格式可以更复杂,支持许多不同的字段和属性.确保跨设备进行测试,以确保兼容性.此外,为了更好地处理较大的数据,您可以考虑使用StringBuffer而不是StringBuilder.

Android相关问答推荐

如何更新Kotlin中的显示?

如何将两个变量传递给Nav主机,然后将其传递给另一个屏幕?

如何在使用带有底部导航组件的片段管理器时更改片段工具栏的标签

如何制作安卓';s FileProvider在Android 11上使用外部存储+

可组合函数无限地从视图模型获取值

从我的 Android 应用程序发送到 Gin 时失败,但从 Postman 发送到 Gin 时成功

错误:参数的类型必须是用@Entity注释的类或其集合/array. java.lang.String tocd);

如何在C++中使用JNI_GetCreatedJavaVMs调用Java代码

Jetpack Compose - 在屏幕外偏移绘制形状并使用非常大的尺寸

单击按钮时不显示 Toast 消息

Electric Eel 后 Gradle 项目同步失败 | 2022.1.1更新

React Native Android 应用程序在调试模式下运行良好,但当我们发布 apk 时,它会生成旧版本的应用程序

如何像 XML 一样在 Compose Android Studio 中折叠/展开小部件代码区域/区域

找不到(包名称).在以下位置搜索:

Jetpack Compose - 每次点击按钮都不起作用

java.lang.String 类型的值 Forbidden 无法转换为 JSONObject

Jetpack Compose:如何绘制这样的路径/线

如何根据加载图像的 colored颜色 绘制边框?

使用 Jetpack Compose 的深层链接导航到可组合项

在使用 Retrofit 和 Room 时,我是否需要提及协程调度程序?