接收分享内容
让生成的 App 出现在 Android 系统分享面板中,把内容分享进 App —— 相册里的截图、聊天里的照片、浏览器里的链接。
这是"出向"的镜像:navigator.share 把页面内容推给系统,而这个功能把系统内容拉进页面。
在编辑通用配置编辑器的特殊设置 → 基础开关中按 App 开启。
用户看到的
- 截图后点分享。
- 生成的 App 与相册、聊天软件等一起出现在分享目标列表中。
- 点它。App 打开(或切到前台),内容已经在页面里等着了。
两条投递通道
内容进来后要送到网页上。有两条路,各自覆盖不同的场景。
页面事件
App 会在 window 和 document 上派发 wta:share DOM 事件,同时暴露一个小 API:
// 订阅分享批次,返回取消订阅函数。
const off = window.WTAShareInbox.onShare((items) => {
for (const item of items) {
// item.type "image" | "video" | "audio" | "text" | "file"
// item.mimeType "image/png"
// item.name "Screenshot_2026-09-17.png"
// item.size 字节数
// item.inline true 表示 dataUrl / text 里带着内容
// item.dataUrl "data:image/png;base64,…" (内联时,文件 ≤ 5 MB)
// item.text 分享的文本 (文本分享)
// item.fileUrl "file:///…" (本机副本;http 页面通常读不到)
// item.readBlob() / item.readDataUrl() 文件条目始终可用
}
});
// 或者按需拉取 —— 当前文档收到且尚未取走的内容。
const pending = window.WTAShareInbox.peek();
const taken = window.WTAShareInbox.take(); // 同时将这些条目在原生侧标记为已消费wta:share 事件通过 event.detail.items 携带同一个数组:
window.addEventListener('wta:share', (e) => {
console.log(e.detail.items);
});条目会一直留在收件箱,直到页面消费或过期为止。take() 会把它返回的条目标记为已消费;只监听事件的页面可以显式确认:
window.WTAShareInbox.consume(item.id); // 或 consume([id1, id2, …])已消费的条目不会再被派发 —— 不会推到之后的文档,也不会在下次启动时重现。没有被消费的条目仍会在每次文档加载时重发 wta:share,因此处理到一半刷新页面也不会丢内容。两种情况下 fileUrl 副本在 1 小时过期前都可读。
这条通道零点击,但只对会监听的页面有效 —— 你自己写的 HTML/前端 App,或者声明了 DOM_ACCESS 权限并注册监听的扩展模块。第三方网站并不知道这个事件。
5 MB 以内的图片会以内联 base64 data: URL 交付。更大的图片仍会出现在事件里(inline: false),并留在收件箱(单文件上限 64 MB)。http://127.0.0.1 这类页面源读不了 fileUrl,请按需读取字节:
window.addEventListener('wta:share', async (e) => {
for (const item of e.detail.items) {
if (item.type === 'text') { /* item.text */ continue; }
const dataUrl = item.dataUrl || await item.readDataUrl();
// 或者:const blob = await item.readBlob(); // 也可用 window.WTAShareInbox.readBlob(item.id)
}
});文件选择器
任何网站上任何上传控件都必然经过 WebView 的文件选择器。页面打开选择器时,App 可以直接用分享进来的内容应答,而不是弹出系统选择器。
这条通道对任意网站生效 —— 包括完全不知道这个功能存在的网站。
使用前先询问打开时(默认),会弹一个小提示让用户选择使用分享的文件还是走系统选择器;关闭后直接用分享内容应答上传。
设置
| 设置项 | 作用 |
|---|---|
| 接收图片 | 把 App 注册为图片分享目标。 |
| 接收文本与链接 | 同时接收纯文本分享。默认关闭:打开后,任何 App 里分享链接都会出现本 App。 |
| 投递方式 | 页面事件、预填文件选择器 或 两者都使用(默认)。 |
| 使用前先询问 | 仅在启用文件选择器通道时显示。 |
| 收到分享时弹出提示 | 与文件选择器通道一起出现。提示用户去点页面上的上传按钮。页面自己处理 wta:share 时请关掉。投递方式为仅页面事件时不显示(也不会弹 toast)。 |
功能默认关闭。开启会改变生成的清单 —— App 多出一个 ACTION_SEND 入口 —— 其信誉成本与定位、通知等选项相同,因此保持 opt-in。
限制
- 第三方网站无法自动提交。 Web 内容不允许以编程方式设置文件输入框的值,不监听
wta:share的网站也永远收不到该事件。对这类网站,现实流程是:分享进来,然后在页面点击上传控件,分享的内容会被使用。自动提交表单、或模拟点击上传按钮,都在刻意排除的范围之外。 - 收到的内容 1 小时后过期。 收件箱是交接缓冲区,不是存储。
- 单次分享上限: 10 个条目、单文件 64 MB、收件箱 192 MB。超出会被丢弃,且每项限制都在流式复制过程中执行 —— 发送方是不可信的第三方。
- 内容会在发送方 URI 的一次性读权限仍有效时立即复制出来,URI 本身不会被保存。
说明
- 除非打开接收文本与链接,否则只注册
image/*。 - intent-filter 在导出时注入,因此关闭该功能的构建产物与引入此选项之前完全一致。
