/** * 剪贴板能力(契约 §8.4,T-M3-05)。@kit.BasicServicesKit pasteboard。 * - gameCopytext:data=文本,写入系统剪贴板。 * - gamepastetext:读取剪贴板内容,经 responseCallback 返回(getData 异步,回调延后触发,对 H5 仍是同步回执语义)。 * 前台应用读取自身剪贴板无需声明权限;失败回空串(H5 不卡死)。 */ import { pasteboard } from '@kit.BasicServicesKit'; import { BusinessError } from '@kit.BasicServicesKit'; import { BridgeController } from 'feature_bridge'; import { InboundHandlers } from 'contracts'; import { Logger } from 'common'; import { CapabilityContext, CapabilityProvider } from '../core/CapabilityProvider'; export class ClipboardProvider implements CapabilityProvider { readonly name: string = 'clipboard'; private readonly log: Logger = Logger.tag('ClipboardProvider'); register(bridge: BridgeController, _ctx: CapabilityContext): void { bridge.registerHandler(InboundHandlers.GameCopyText, (data: string, _cb: (resp: string) => void) => { this.copy(data); }); bridge.registerHandler(InboundHandlers.GamePasteText, (_d: string, cb: (resp: string) => void) => { this.paste(cb); }); } private copy(text: string): void { try { const data: pasteboard.PasteData = pasteboard.createData(pasteboard.MIMETYPE_TEXT_PLAIN, text); pasteboard.getSystemPasteboard().setData(data) .catch((e: BusinessError) => this.log.w(`setData failed: ${e.code} ${e.message}`)); } catch (e) { this.log.w(`copy failed: ${(e as Error).message}`); } } private paste(cb: (resp: string) => void): void { pasteboard.getSystemPasteboard().getData() .then((data: pasteboard.PasteData) => { cb(data.getPrimaryText() ?? ''); }) .catch((e: BusinessError) => { this.log.w(`getData failed: ${e.code} ${e.message}`); cb(''); }); } }