PAYATHON 2026

Android 应用如何向 Sharesheet 提供自定义分享目标?

数据阿明

结论

要让自己的应用像 WhatsApp 一样,在 Android Sharesheet 中提供联系人等 Direct Share 目标,需要由接收分享的应用发布 Sharing Shortcuts。通常可以使用 AndroidX 的 ShortcutManagerCompat 发布动态快捷方式,并在 res/xml/shortcuts.xml 中声明它们支持的数据类型和类别。发起分享的应用只需创建普通分享 Intent,无需了解有哪些目标应用。

Sharesheet 会根据接收应用发布的快捷方式、声明的数据类型和系统排序展示候选目标。应用可以提供目标,但无法保证某个目标一定排在顶部。Android 官方:Provide Direct Share targets

配置分享目标

假设应用要接收 text/plain 内容,并由 ShareActivity 处理分享。先在 res/xml/shortcuts.xml 中声明目标及类别:

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
    <share-target android:targetClass="com.example.app.ShareActivity">
        <data android:mimeType="text/plain" />
        <category android:name="com.example.app.category.TEXT_SHARE_TARGET" />
    </share-target>
</shortcuts>

然后在应用清单的 <application> 中引用该文件:

<meta-data
    android:name="android.app.shortcuts"
    android:resource="@xml/shortcuts" />

ShareActivity 还需要声明能够接收相应分享 Intent 的过滤器:

<activity android:name=".ShareActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
</activity>

<share-target> 中的类别必须与应用发布的快捷方式类别一致,MIME 类型也要与快捷方式支持的分享内容相符。

发布联系人的动态快捷方式

获取会话或联系人的真实数据后,应用可以为每个可用目标创建快捷方式,并通过 ShortcutManagerCompat 发布。下面的 Kotlin 片段展示了核心配置:

private const val TEXT_SHARE_TARGET =
    "com.example.app.category.TEXT_SHARE_TARGET"

fun publishConversation(
    context: Context,
    conversationId: String,
    displayName: String
) {
    val shortcut = ShortcutInfoCompat.Builder(
        context,
        "conversation:$conversationId"
    )
        .setShortLabel(displayName)
        .setLongLabel(displayName)
        .setIcon(IconCompat.createWithResource(context, R.drawable.ic_contact))
        .setCategories(setOf(TEXT_SHARE_TARGET))
        .setLongLived(true)
        // 此 Intent 用于从快捷方式启动应用时进入对应会话。
        .setIntent(
            Intent(context, ShareActivity::class.java)
                .setAction(Intent.ACTION_VIEW)
                .putExtra("conversation_id", conversationId)
        )
        .build()

    ShortcutManagerCompat.pushDynamicShortcut(context, shortcut)
}

setIntent() 设置的是从启动器等入口打开快捷方式时进入会话的行为。用户在 Sharesheet 中选择匹配的分享目标时,系统会根据 <share-target> 的声明,把分享内容交给对应的 Activity。接收端应处理 Intent.ACTION_SEND,读取所需的分享数据,例如 Intent.EXTRA_TEXT 或 Intent.EXTRA_STREAM,并通过 Intent.EXTRA_SHORTCUT_ID 识别用户选择的快捷方式。

如果要一次发布多个动态目标,也可以使用 ShortcutManagerCompat.setDynamicShortcuts() 设置快捷方式列表。联系人或会话发生变化时,应更新列表;用户删除联系人后,也应移除对应快捷方式。Android 官方:发布和管理 Direct Share 目标

版本与展示注意事项

  • Sharing Shortcuts API 从 Android 10(API level 29)开始用于 Direct Share。Android 11(API level 30)起,ChooserTargetService 已弃用;新实现应使用 Sharing Shortcuts API。AndroidX 的 ShortcutManagerCompat 提供兼容支持。
  • 快捷方式需要使用唯一且稳定的 ID,并与 <share-target> 的类别和 MIME 类型匹配。系统会根据相关性和使用情况排序,动态快捷方式的数量也受上限约束。
  • 不应继续发布过时或不相关的联系人目标。用户选择目标后,应直接进入对应会话,或进入处理该分享内容的界面。
  • 如果“自定义目标”指的是 Sharesheet 中额外的固定操作按钮,而不是联系人的 Direct Share 目标,可以通过 Intent.EXTRA_INITIAL_INTENTS 添加 Activity 操作。此操作不会替代联系人快捷方式。

备注:内容仅供参考。