如何实现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
相关产品推荐
相关产品推荐

