鸿蒙跨设备剪贴板开发:从PasteData到分布式KV的完整实践
手机复制地址平板那边马上能粘贴电脑上复制一段代码手机顺手就能贴进备忘录。这是我接触鸿蒙跨设备剪贴板之后最直观也最上头的体验。刚开始我并不觉得这算什么大功能直到自己动手写了一个跨设备剪贴板的小工具才意识到这背后牵扯的东西比想象中多剪贴板数据模型、分布式数据同步、权限与隐私约束、多设备冲突处理……每个环节都能让人踩出好几个坑。这篇就把我“从用户变成开发者”的整个过程整理出来既讲清楚鸿蒙跨设备剪贴板的原理也给出可以直接照着跑的demo和踩坑记录适合正在学鸿蒙开发、或者想在自己的应用里做跨端复制粘贴功能的人。1. 先弄清“剪贴板”在鸿蒙里到底是一个什么东西1.1 一次手机到平板的复制让我看到了设备割裂起因其实很简单。我在手机上刷到一个地址想把它填进平板上正在编辑的表单里。按以前的做法要么拿微信发给自己要么手动重新输一遍再要么用第三方同步工具中转。全程大概要花二三十秒而且中间只要切一次应用复制的内容就丢了。后来我打开手机和平板的“超级终端”两台设备连在一起随便复制了一条文本平板这边直接在输入框长按粘贴内容就出现了。说实话那一刻我挺意外的因为我没有做任何“发送”动作复制完直接就过去了。但当我真正想在自己的应用里复刻这个功能时才发现系统帮我们做好的“一键粘贴”背后是一整套剪贴板数据模型加分布式传输链路。先搞清楚剪贴板数据的组织方式后面才不会一头雾水。1.2 PasteData剪贴板数据的核心容器鸿蒙里所有要进剪贴板的内容最终都会被包装成PasteData。你可以把它理解成一个“袋子”袋子里面可以装多种类型的条目比如纯文本、HTML、图片URI、文件URI等。我在工程里最常用的两种创建方式长这样import { pasteboard } from kit.BasicServicesKit; // 创建一条纯文本剪贴板数据 let textData: pasteboard.PasteData pasteboard.createData(hello harmony); // 创建带MIME类型的富文本数据 let htmlData: pasteboard.PasteData pasteboard.createData({ mimeType: pasteboard.MIMETYPE_TEXT_HTML, value: b鸿蒙/b });PasteData本身不区分“这是从哪个App来的”它只负责把内容装好。真正决定你能读到什么内容、以及内容能不能跨设备传过去的是后面的两个环节一个是系统剪贴板对象另一个是数据同步通道。1.3 系统剪贴板与分布式数据两条完全不同的通路刚接触时我有个误区以为跨设备剪贴板就是把系统剪贴板同步一下。后来发现系统剪贴板SystemPasteboard是本地概念它只管当前设备上的读写跨设备传递依赖的是分布式能力。也就是说鸿蒙的跨设备剪贴板是分层的系统级协同剪贴板设备在超级终端里组网后系统帮你把剪贴板内容自动同步用户无感知。这个功能对使用场景、账号、网络都有要求而且第三方应用无法直接调用这套系统协同剪贴板能力去定制行为。开发级自建通路应用自己通过分布式数据接口把本机剪贴板内容写到分布式存储里另一台设备监听变化并写入自己的系统剪贴板。路径完全由开发者控制灵活但麻烦。我后面选择的是第二种方案原因很简单只有自己能控制“什么时候同步、同步什么、要不要提示用户”在实际产品里才有可用性。2. 第一关在本机上把剪贴板读写跑通2.1 工程准备我用的是DevEco Studio创建了一个空工程ArkTS语言API版本选择当前稳定版即可。开发跨设备剪贴板有两块基础能力是绕不开的kit.BasicServicesKit里面包含pasteboard负责本机剪贴板读写。kit.ArkData里面包含distributedKVStore负责分布式数据同步。新建工程后第一件事就是确认module.json5里该声明的权限。读写剪贴板的权限声明方式和普通权限不太一样后面第4节会细说。第一步我建议先不沉迷分布式老老实实把本机读写跑通因为这是整条链路的地基。2.2 写入剪贴板最简单的打通写入系统剪贴板的流程就三步创建PasteData拿到系统剪贴板实例调用setData。import { pasteboard } from kit.BasicServicesKit; import { BusinessError } from kit.BasicServicesKit; function writeClipboard(text: string): void { const systemPasteboard: pasteboard.SystemPasteboard pasteboard.getSystemPasteboard(); const data: pasteboard.PasteData pasteboard.createData(text); systemPasteboard.setData(data).catch((err: BusinessError) { console.error(写入剪贴板失败: ${err.code} ${err.message}); }); }setData 是异步操作不要在主线程里假设写完之后立刻就能读取。实际测试中写入成功后立刻读取绝大多数情况没问题但如果数据比较大还是给系统一点时间。2.3 读取与监听剪贴板变化读取用getData返回的是一个PasteData对象里面可能有多种类型的条目。最常用的是取主文本import { pasteboard } from kit.BasicServicesKit; import { BusinessError } from kit.BasicServicesKit; async function readClipboard(): Promisestring | undefined { const systemPasteboard: pasteboard.SystemPasteboard pasteboard.getSystemPasteboard(); try { const data: pasteboard.PasteData await systemPasteboard.getData(); return data.getPrimaryText(); } catch (err) { const e err as BusinessError; console.error(读取剪贴板失败: ${e.code} ${e.message}); return undefined; } }另外应用可以在用户主动操作的前台场景监听剪贴板变化接口是on(update)。不过别滥用剪贴板监听在鸿蒙上属于敏感能力如果被系统判定为“后台偷偷读剪贴板”很可能被限制。systemPasteboard.on(update, () { console.info(剪贴板内容发生变化); });2.4 为什么必须先跑通本机再做跨设备我见过不少新手上来就直接写分布式结果本地剪贴板都还没读对最后分不清问题出在“写入失败”还是“同步失败”。本机读写跑通有三个意义第一验证权限和隐私弹窗在你的工程里到底是什么表现第二确定你拿到的数据类型和实际粘贴场景一致第三后面跨设备调试时你可以先在本机打日志确认数据没问题再去看分布式那一段。基础不牢后面排错会非常痛苦。3. 第二关用分布式能力把剪贴板“送”到另一台设备3.1 设备发现先确认对面有人跨设备同步的第一步是知道当前有哪些可信设备在线。鸿蒙里通过deviceManager获取设备列表import { deviceManager } from kit.DistributedServiceKit; let dm: deviceManager.DeviceManager deviceManager.createDeviceManager(com.example.clipboard); let devices: ArraydeviceManager.DeviceBasicInfo dm.getTrustedDeviceListSync(); for (let device of devices) { console.info(发现设备: ${device.deviceName}, id: ${device.networkId}); }这里的“可信设备”通常指的是登录同一账号、并且组过网的设备。设备离线时列表里可能依然有记录但状态会变成不可用。开发时我习惯先把这个列表展示在界面上点一台设备再执行同步这样测试起来非常直观。3.2 数据通道分布式KV最贴合剪贴板场景跨设备剪贴板本质上是“小数据、高频率、需要多端一致”。这类需求用分布式KV Store是最顺手的。它不需要你自己维护一份复杂的服务端协议直接把键值对放进 store系统会尝试同步到组网内的其他设备。我常用的配置如下import { distributedKVStore } from kit.ArkData; const kvConfig: distributedKVStore.KVManagerConfig { bundleName: com.example.clipboard, userInfo: { userId: 0, userType: distributedKVStore.UserType.SAME_USER_ID } }; const kvManager: distributedKVStore.KVManager distributedKVStore.createKVManager(kvConfig); const kvOptions: distributedKVStore.Options { createIfMissing: true, encrypt: false, backup: false, autoSync: true, securityLevel: distributedKVStore.SecurityLevel.S2 }; const kvStore await kvManager.getKVStore(clipboard_sync, kvOptions);然后写入剪贴板数据时我会同时写三个字段await kvStore.put(clipboard_text, text); await kvStore.put(clipboard_update_time, Date.now().toString()); await kvStore.put(clipboard_source_device, localDeviceId);text 是真正的内容update_time 用来处理冲突source_device 用来告诉对端这条内容是从哪台设备来的。这三个字段在后面的冲突处理和小卡片提示里都会用到。对面设备要做的就是订阅这个 store 的数据变化kvStore.on(dataChange, distributedKVStore.SubscribeType.SUBSCRIBE_TYPE_ALL, (data) { console.info(收到数据变更: ${JSON.stringify(data)}); // 在这里读取 clipboard_text弹提示等用户确认后再写入本机剪贴板 });3.3 设计本地缓冲别把远端内容直接盖到本机剪贴板这是我最想强调的一步。很多第一次做跨设备复制的人会在收到远端更新后立刻调用setData写进本机系统剪贴板。结果就是用户在平板正复制了一段话手机那边一同步平板剪贴板内容被顶掉了用户下一粘贴出来的是手机上刚才复制的东西。正确的做法是引入“用户确认”这个环节收到远端剪贴板变更读取clipboard_text和clipboard_source_device弹出一条系统提示或者应用内卡片来自手机A的内容是否粘贴用户点了“粘贴”才写本机系统剪贴板。这种方式看着多了一步实际体验反而更好。因为用户知道自己即将粘贴什么不会被突然覆盖也不会产生“这内容到底哪来的”的困惑。3.4 一个最小闭环demo的实测效果我把上面这套逻辑做成一个测试页面手机A复制一段文本应用把文本推送到分布式KV平板B收到变化后弹出提示卡片点击“去粘贴”平板B把内容写入自己的系统剪贴板然后用户随便在哪个输入框长按粘贴即可。实测数据如下数据类型体量实测同步耗时纯文本1KB以内300ms-800ms富文本/HTML几KB1秒左右图片/文件URI几百KB起步3秒以上不稳定从实测能看出纯文本是跨设备剪贴板最稳定的内容形态。图片、文件这类大对象走分布式KV体感明显变差而且容易触发额外的存储权限。如果你的应用主打图片复制建议先做缩略图或者下载链接不要直接把大图塞进去。4. 权限申请、触发条件与那些防不胜防的坑4.1 读剪贴板权限不是想读就能读鸿蒙对剪贴板读取的管控比较严格。应用在前台且用户主动触发粘贴时系统剪贴板读取相对顺畅但如果你想在后台或者用户无感知的情况下读取基本会被系统拦下或者弹出敏感的隐私提示。module.json5里的权限声明大致是{ name: ohos.permission.READ_PASTEBOARD, reason: 用于在用户主动粘贴时读取剪贴板内容以完成跨设备同步, usedScene: { abilities: [EntryAbility], when: inuse } }写入权限目前比读取宽松但同样要避免设计成“无感上传”。我的经验是所有读取操作都尽量放在用户点击、长按、粘贴这些动作之后既合规又不会吓到用户。4.2 同账号、同局域网、开协同三个硬门槛很多刚开始用跨设备剪贴板的人第一反应是“为什么我的手机和电脑复制不同步”。我在开发过程中把系统级协同剪贴板的触发条件总结成了三件事同一账号手机、平板必须登录同一个华为账号/鸿蒙账号否则设备之间根本不会建立信任关系同一网络设备最好在同一个局域网内或者已经通过超级终端建立了稳定的互联关系协同开关设备的超级终端、多设备协同相关功能需要处于开启状态这个开关在设置里找“超级终端”入口。这三个条件缺一个系统级跨设备剪贴板基本不会工作。第三方应用如果不想受这些条件限制那就只能走自己的自建通道比如用分布式数据接口或者自己搭服务端中转。4.3 数据格式覆盖不全图片、文件、链接的坑剪贴板里的内容不一定都是纯文本。我自己实测下来最典型的坑有三个图片复制很多应用复制图片后剪贴板里存的不是bitmap而是一个媒体库URI。这个URI在另一台设备上可能根本打不开因为媒体库内容并不保证跨设备可见。文件复制类似复制文件到剪贴板常见的是文件URI加权限信息。跨设备读取时文件本身还在原设备上远端拿到只是一个无效引用。链接与富文本HTML内容可能带有样式引用对端显示时样式丢失甚至出现乱码。所以我的建议是跨设备剪贴板在自建方案里默认只稳定支持文本。需要支持图片时单独做文件传输逻辑不要指望剪贴板的格式兼容性替你兜底。4.4 双端同写冲突谁才是最新的那条分布式KV的同步不是瞬间完成的两台设备同时各自复制内容时会出现“先写后至”的覆盖问题。比如手机复制了A平板马上复制了BA 的同步数据可能晚到平板直接把 B 顶掉。我的处理策略是用时间戳做应用层判断因为KV本身是后写覆盖时间戳只能帮我做“忽略旧数据”的决策const remoteTime Number(remoteRecord.updateTime); const localTime Number(localRecord.updateTime); if (remoteTime localTime) { // 这次远端更新更新可以处理 } else { // 远端数据比本地的旧忽略 }但要注意这个方式只能降低冲突概率不能完全解决。真正要稳妥需要在写入前做一个短暂的去抖比如400ms内没有新的本地复制行为才把当前内容同步出去。用户连续高速复制时宁可丢一次同步也不要出现内容互相覆盖。4.5 别忽略“静默失败”分布式KV有一个让人头疼的特点put返回成功不代表数据已经同步到对端。网络不稳定、对端离线、服务异常时写入可能只是在本地store里生效远端根本没收到。如果你只盯着写入端的成功日志就很容易以为功能正常。实际调试时一定要在对端打日志确认收到了dataChange事件。我在第三版里把同步状态做成了界面上的显示成功、待同步、失败重试否则出了问题连用户都说不清是哪一步断的。5. 从“能同步”到“好用”我迭代三版之后的设计取舍5.1 第一版单向推送结果被隐私弹窗劝退第一版实现得很朴素手机复制 → 同步到KV → 平板监听 → 直接写本机剪贴板。功能是通的但体验很糟。首先是系统隐私提示频繁出现平板用户会不断看到类似“某个应用正在读取你的剪贴板”的提醒次数多了用户直接卸载。其次是“剪贴板被悄悄替换”的违和感用户明明正在写文档粘贴出来的却是手机上半小时前复制的内容心态直接崩掉。这版让我明白了跨设备剪贴板不是技术问题而是体验问题。技术只是把数据搬过去体验才是让用户愿意用它的关键。5.2 第二版把“自动覆盖”改成“待粘贴卡片”第二版改成了主动确认制。远端数据到达后我弹一个轻量卡片显示来源设备、内容预览和两个按钮粘贴、忽略。只有用户点了粘贴才会写本机剪贴板。这个改动带来的收益超出预期。用户不再被剪贴板内容突然变化惊讶到也减少了误粘贴。更重要的是它让剪贴板读写全部发生在用户主动操作的时间点权限合规上省了很多心。卡片上还加了一个小细节显示来源设备名称。这个不起眼的信息让用户对“这段内容从哪里来”完全有数信任感一下子就不一样了。5.3 第三版内容分类与过期清理第三版我重点处理了两件事内容分类和过期清理。剪贴板内容是分敏感等级的。验证码、密码这类内容我会在同步时打上sensitive标记对端收到后只显示“收到一条敏感内容”不展示明文而且5分钟后自动从KV和历史记录里清除。普通链接和文本保留时间长一些但同样设置TTL避免分布式KV里堆一堆陈年旧剪贴板。分类规则用一张简单的配置表维护类型判定方式保留时间对端展示验证码/密码正则匹配数字验证码、password关键词5分钟不展示内容仅提示链接http/https开头30分钟展示链接点击打开普通文本以上都不满足12小时展示纯文本供一键粘贴图片/文件URI类型不自动同步提示使用其他传输方式这套规则跑起来之后跨设备剪贴板才算真正从“玩具项目”变成了我日常会用的工具。5.4 给想入坑鸿蒙开发的同学几句大实话如果你也想做类似的跨设备功能我的建议是先别惦记那些复杂的架构按这个顺序走先花一两天把本机剪贴板读写和权限模型搞明白再花两三天跑通分布式KV的最小闭环最后再来设计“什么时候同步、怎么提示、如何处理冲突”。很多人搜“鸿蒙开发教程”时会问需要什么基础我的答案是有TypeScript或JavaScript经验能跑通DevEco Studio的Hello World就可以动手做这个项目了难度其实没有想象中高。踩过这几轮坑之后我对跨设备剪贴板的看法也变了系统级协同剪贴板适合“零成本体验”但第三方应用要做出差异化体验就必须把数据通道和交互确认握在自己手里。分布式KV负责把数据送过去真正的产品价值在于你对“何时粘贴、如何呈现、怎么清理”的设计。这个思路放到其他跨设备场景里也照样适用。

相关新闻

MySQL8.0索引调优实战:从慢SQL到执行计划与联合索引设计

MySQL8.0索引调优实战:从慢SQL到执行计划与联合索引设计

前两天同事跑过来,说线上有个查询要三秒多,问我是不是加个索引就行。我让他先EXPLAIN一下,结果typeALL,rows直接奔着四百万去。后来在(shop_id, status, created_at)上加了一个联合索引,三秒变成二十毫秒。这种案例在M…

2026/10/10 13:00:50 阅读更多 →
OpenClaw 实例暴露事件解析:从裸奔自查到安全加固的完整指南

OpenClaw 实例暴露事件解析:从裸奔自查到安全加固的完整指南

先说结论:这条“25 万 OpenClaw 实例暴露”的安全提醒,不是危言耸听,更不是在制造流量焦虑。我自己的判断很直接:OpenClaw 这类开源 AI Agent 现在确实火,但太多人只是照着“openclaw 安装教程”把服务跑起来&#xff…

2026/10/10 13:00:50 阅读更多 →
Mirror Particle:人类行为世界模型的多尺度物理化建模框架

Mirror Particle:人类行为世界模型的多尺度物理化建模框架

1. 项目概述:当“镜像粒子”不再只是物理概念,而成为理解人类行为的底层框架“Mirror Particle”这个词乍一听像是高能物理实验室里刚跑出来的术语——毕竟在标准模型里,镜像粒子是为解释中微子振荡、暗物质候选者或CP破坏现象而提出的理论构…

2026/10/10 13:00:50 阅读更多 →

最新新闻

PINN求解中子扩散方程:机器学习在中子学的应用

PINN求解中子扩散方程:机器学习在中子学的应用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 13:41:42 阅读更多 →
PCA9422电源管理芯片与STM32F446ZE低功耗方案实战

PCA9422电源管理芯片与STM32F446ZE低功耗方案实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 13:41:42 阅读更多 →
三级Linux真题精讲:从进程管理到LVM的运维实战拆解

三级Linux真题精讲:从进程管理到LVM的运维实战拆解

1. 项目总览:一套能让你真正上手的三级Linux真题1.1 为什么单独拿“真题1”出来做拆解计算机等级考试三级Linux应用与开发技术,一直是考证圈里比较“实在”的一门。它不像嵌入式或者数据库那样需要背一堆厂商概念,也不像四级那样偏向理论推演…

2026/10/10 13:41:42 阅读更多 →
雪消融优化算法(SAO)优化SVR超参数:MATLAB回归预测实现

雪消融优化算法(SAO)优化SVR超参数:MATLAB回归预测实现

这些年做预测模型,SVR一直是我常用的回归工具之一,尤其适合中小规模样本的非线性回归。但用SVR最头疼的不是写训练代码,而是调参数——C取多少,gamma取多少,epsilon取多少,这三个数直接决定模型好坏。以前我…

2026/10/10 13:41:42 阅读更多 →
STM32+PMIC实现动态电压调节:基于PCA9422的电源管理方案设计

STM32+PMIC实现动态电压调节:基于PCA9422的电源管理方案设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 13:41:42 阅读更多 →
推理平台怎么挑:2026 七家主流聚合服务的广度、速度与合规之争

推理平台怎么挑:2026 七家主流聚合服务的广度、速度与合规之争

2026 年的 AI 大模型推理平台市场,已经在模型覆盖度、定价、速度、合规四个维度上形成清晰分工:有平台拼广度,把全球厂商模型聚成一个入口;有平台拼速度,把推理延迟压到极限;国内平台则在访问稳定性与国产模…

2026/10/10 13:40:40 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →