代码之家  ›  专栏  ›  技术社区  ›  nope

如何共享不存在的联系人?(仅信息)在Android?

  •  1
  • nope  · 技术社区  · 2 年前

    上下文:我有一个二维码扫描仪应用程序,可以扫描联系人信息。扫描后,用户可以添加联系人或共享联系人。我如何共享(如果可以的话)到另一个应用程序?

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

    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
    }
    

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

    1 回复  |  直到 2 年前
        1
  •  0
  •   Vijay    2 年前

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

    所涉及的步骤包括:

    1. 根据联系人信息创建vCard字符串。
    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"))
    }
    
    

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

    注:这是一个基本示例。vCard格式可能更复杂,支持许多不同的字段和属性。请确保在设备之间进行测试以确保兼容性。此外,为了在较大的数据中获得更好的性能,您可以考虑使用StringBuffer而不是StringBuilder。