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

如何实现Intent选择器仅展示referral link,选择目标应用后再将msgBody并入Intent.EXTRA_TEXT?

如何实现Intent选择器仅展示referral link,选择目标应用后再将msgBody并入Intent.EXTRA_TEXT?

这个问题我之前也踩过坑!系统默认的Intent选择器会直接把你设置的EXTRA_TEXT内容当成预览展示,所以直接放完整内容肯定会把msgBody也暴露出来。要实现「预览只显示链接,选完应用再发完整内容」,核心思路是把「选择应用」和「发送完整内容」拆成两步——自己做选择器,而不是依赖系统的createChooser,具体步骤如下:

1. 先获取所有支持文本分享的应用列表

我们需要先拿到设备上能处理ACTION_SEND + text/plain的应用,用PackageManager的queryIntentActivities方法就能筛选出这些应用的信息:

private fun getAvailableShareApps(): List<ResolveInfo> {
    val tempIntent = Intent(Intent.ACTION_SEND).apply {
        type = "text/plain"
        // 这里临时放链接只是为了过滤支持文本分享的应用,不影响后续预览
        putExtra(Intent.EXTRA_TEXT, referralLink)
    }
    return packageManager.queryIntentActivities(tempIntent, 0)
}

2. 自定义应用选择对话框

用系统的AlertDialog(或者你自己的自定义弹窗)展示这些应用的名称和图标,让用户选择:

// 第一步获取应用列表
val shareApps = getAvailableShareApps()
if (shareApps.isEmpty()) {
    Toast.makeText(this, "没有可用的分享应用", Toast.LENGTH_SHORT).show()
    return
}

// 提取应用名称和图标
val appNames = shareApps.map { it.loadLabel(packageManager).toString() }

// 构建对话框
AlertDialog.Builder(this)
    .setTitle("分享推荐链接")
    // 如果想在选择器里直观显示链接,可以自定义列表项布局,这里用默认文字也能满足需求
    .setItems(appNames.toTypedArray()) { _, selectedIndex ->
        // 用户选择应用后,触发真正的分享逻辑
        launchFullShareIntent(shareApps[selectedIndex])
    }
    .show()

3. 构建完整分享Intent并启动

用户选好应用后,我们再创建包含msgBody + referralLink的完整Intent,并指定启动选中的应用:

private fun launchFullShareIntent(selectedApp: ResolveInfo) {
    val finalShareIntent = Intent(Intent.ACTION_SEND).apply {
        type = "text/plain"
        // 放入完整的内容
        putExtra(Intent.EXTRA_TEXT, msgBody + referralLink)
        // 保留你原来的收件人设置
        putExtra(Intent.EXTRA_EMAIL, arrayOf(recipient.email))
        // 关键:指定要启动的应用组件,确保只打开用户选中的应用
        component = ComponentName(
            selectedApp.activityInfo.packageName,
            selectedApp.activityInfo.name
        )
    }
    startActivity(finalShareIntent)
}

为什么不能用系统的createChooser?

因为系统的Intent.createChooser是直接基于你传入的Intent生成预览内容的,它会读取EXTRA_TEXT来显示在选择器里,没办法做到「预览内容」和「实际发送内容」不一致。所以必须自己接管应用选择的流程,才能实现这个需求。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 14:24:37