鸿蒙next教程:剪贴板开发(使用剪贴板进行复制粘贴)_笔记本鸿蒙系统复制粘贴怎么弄
往期鸿蒙全套实战文章必看:(附带鸿蒙全栈学习资料)
-
鸿蒙开发核心知识点,看这篇文章就够了
-
最新版!鸿蒙HarmonyOS Next应用开发实战学习路线
-
鸿蒙HarmonyOS NEXT开发技术最全学习路线指南
-
鸿蒙应用开发实战项目,看这一篇文章就够了(部分项目附源码)
使用剪贴板进行复制粘贴
场景介绍
剪贴板为开发者提供数据的复制粘贴能力。当需要使用复制粘贴等功能时,例如:复制文字内容到备忘录中粘贴,复制图库照片到文件管理粘贴,就可以通过剪贴板来完成。
约束限制
- 剪贴板内容包含剪贴板系统服务元数据和应用设置的数据,总大小上限默认为128MB,PC/2in1设备可通过系统配置修改上限,有效范围为128MB~2GB。
- 为保证剪贴板数据的准确性,同一时间只能支持一个复制操作。
- API version 12及之后,系统为提升用户隐私安全保护能力,剪贴板读取接口增加权限管控。
使用基础数据类型进行复制粘贴
剪贴板支持使用基础数据类型进行复制粘贴,当前支持的基础数据类型有文本、HTML、URI、Want、PixelMap。ArkTS接口与NDK接口支持数据类型不完全一致,使用时须匹配接口支持类型。
新开发的应用建议使用本方案实现复制粘贴功能。
ArkTS接口与NDK接口数据类型对应关系
ArkTS数据类型对应剪贴板类型。NDK数据类型对应统一数据管理框架。
接口说明
详细接口见接口文档。
使用剪贴板getData接口获取到uri类型数据之后,请使用文件管理的fs.copy接口获取文件。
示例代码
import { AbilityConstant, UIAbility, Want } from \'@kit.AbilityKit\';import { BusinessError, pasteboard } from \'@kit.BasicServicesKit\';export default class EntryAbility extends UIAbility { async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): Promise { // 获取系统剪贴板对象 let text = \"test\"; // 创建一条纯文本类型的剪贴板内容对象 let pasteData = pasteboard.createData(pasteboard.MIMETYPE_TEXT_PLAIN, text); // 将数据写入系统剪贴板 let systemPasteboard = pasteboard.getSystemPasteboard(); await systemPasteboard.setData(pasteData); //从系统剪贴板中读取数据 systemPasteboard.getData().then((data) => { let outputData = data; // 从剪贴板数据中获取条目数量 let recordCount = outputData.getRecordCount(); // 从剪贴板数据中获取对应条目信息 for (let i = 0; i { // 处理异常场景 }) }}
使用统一数据类型进行复制粘贴
为了方便剪贴板与其他应用间进行数据交互,减少数据类型适配的工作量,剪贴板支持使用统一数据对象进行复制粘贴。详细的统一数据对象请见标准化数据通路文档介绍。
剪贴板支持使用基础数据类型进行复制粘贴,当前支持的基础数据类型有文本、HTML。ArkTS接口与NDK接口支持数据类型不完全一致,使用时须匹配接口支持类型。
接口说明
详细接口见接口文档。
示例代码
import {BusinessError, pasteboard} from \'@kit.BasicServicesKit\';import { unifiedDataChannel, uniformDataStruct, uniformTypeDescriptor } from \'@kit.ArkData\';// 构造一条PlainText数据let plainText : uniformDataStruct.PlainText = { uniformDataType: uniformTypeDescriptor.UniformDataType.PLAIN_TEXT, textContent : \'PLAINTEXT_CONTENT\', abstract : \'PLAINTEXT_ABSTRACT\',}let record = new unifiedDataChannel.UnifiedRecord(uniformTypeDescriptor.UniformDataType.PLAIN_TEXT, plainText);let data = new unifiedDataChannel.UnifiedData();data.addRecord(record);// 向系统剪贴板中存入一条PlainText数据let systemPasteboard: pasteboard.SystemPasteboard = pasteboard.getSystemPasteboard();systemPasteboard.setUnifiedData(data).then((data: void) => { console.info(\'Succeeded in setting UnifiedData.\'); // 存入成功,处理正常场景}).catch((err: BusinessError) => { console.error(\'Failed to set UnifiedData. Cause: \' + err.message); // 处理异常场景});// 从系统剪贴板中读取这条text数据systemPasteboard.getUnifiedData().then((data) => { let records: Array = data.getRecords(); for (let j = 0; j { console.error(\'Failed to get UnifiedData. Cause: \' + err.message); // 处理异常场景});