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 操作。此操作不会替代联系人快捷方式。
备注:内容仅供参考。
