1# 使用剪贴板进行复制粘贴 2 3## 场景介绍 4 5[剪贴板](../../reference/apis-basic-services-kit/js-apis-pasteboard.md)为开发者提供数据的复制粘贴能力。 6当需要使用复制粘贴等功能时,例如:复制文字内容到备忘录中粘贴,复制图库照片到文件管理粘贴,就可以通过剪贴板来完成。 7 8## 约束限制 9 10- 剪贴板内容大小<128MB。 11- 为保证剪贴板数据的准确性,同一时间只能支持一个复制操作。 12- API version 12及之后,系统为提升用户隐私安全保护能力,剪贴板读取接口增加[权限管控](get-pastedata-permission-guidelines.md)。 13 14## 使用基础数据类型进行复制粘贴 15 16剪贴板支持使用基础数据类型进行复制粘贴,当前支持的基础数据类型有文本、HTML、URI、Want、PixelMap。ArkTS接口与NDK接口支持数据类型不完全一致,使用时须匹配接口支持类型。 17 18新开发的应用建议使用本方案实现复制粘贴功能。 19 20### ArkTS接口与NDK接口数据类型对应关系 21| ArkTS数据类型 | NDK数据类型 | 22| -------- |----------------------------------------------------------------------------------------------------------------------------------------| 23| MIMETYPE_PIXELMAP : "pixelMap" | UDMF_META_OPENHARMONY_PIXEL_MAP : "openharmony.pixle-map" | 24| MIMETYPE_TEXT_HTML : "text/html" | UDMF_META_HTML : "general.html" | 25| MIMETYPE_TEXT_PLAIN : "text/plain" | UDMF_META_PLAIN_TEXT : "general.plain-text" | 26| MIMETYPE_TEXT_URI : "text/uri" | UDMF_META_GENERAL_FILE_URI : "general.file-uri" | 27| MIMETYPE_TEXT_WANT : "text/want" | NDK接口不支持该数据类型。 | 28 29ArkTS数据类型对应剪贴板类型,详见[ohos.pasteboard](../../reference/apis-basic-services-kit/js-apis-pasteboard.md)。NDK数据类型对应统一数据管理框架,详见[UDMF](../../reference/apis-arkdata/_u_d_m_f.md)。 30 31### 接口说明 32 33详细接口见[接口文档](../../reference/apis-basic-services-kit/js-apis-pasteboard.md#getdata9)。 34 35使用剪贴板getData接口获取到uri类型数据之后,请使用文件管理的[fs.copy](../../reference/apis-core-file-kit/js-apis-file-fs.md#fscopy11)接口获取文件。 36 37| 名称 | 说明 | 38| -------- |----------------------------------------------------------------------------------------------------------------------------------------| 39| setData(data: PasteData, callback: AsyncCallback<void>): void | 将数据写入系统剪贴板,使用callback异步回调。 | 40| setData(data: PasteData): Promise<void> | 将数据写入系统剪贴板,使用Promise异步回调。 | 41| getData( callback: AsyncCallback<PasteData>): void | 读取系统剪贴板内容,使用callback异步回调。 | 42| getData(): Promise<PasteData> | 读取系统剪贴板内容,使用Promise异步回调。 | 43| getDataSync(): PasteData | 读取系统剪贴板内容, 此接口为同步接口,不能与SetData同线程调用。 | 44 45### 示例代码 46```ts 47import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; 48import { BusinessError, pasteboard } from '@kit.BasicServicesKit'; 49 50export default class EntryAbility extends UIAbility { 51 async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): Promise<void> { 52 // 获取系统剪贴板对象 53 let text = "test"; 54 // 创建一条纯文本类型的剪贴板内容对象 55 let pasteData = pasteboard.createData(pasteboard.MIMETYPE_TEXT_PLAIN, text); 56 // 将数据写入系统剪贴板 57 let systemPasteboard = pasteboard.getSystemPasteboard(); 58 await systemPasteboard.setData(pasteData); 59 //从系统剪贴板中读取数据 60 systemPasteboard.getData().then((data) => { 61 let outputData = data; 62 // 从剪贴板数据中获取条目数量 63 let recordCount = outputData.getRecordCount(); 64 // 从剪贴板数据中获取对应条目信息 65 for (let i = 0; i < recordCount; i++) { 66 let record = outputData.getRecord(i).toPlainText(); 67 console.log('Get data success, record:' + record); 68 } 69 }).catch((error: BusinessError) => { 70 // 处理异常场景 71 }) 72 } 73} 74``` 75 76## 使用统一数据类型进行复制粘贴 77 78为了方便剪贴板与其他应用间进行数据交互,减少数据类型适配的工作量,剪贴板支持使用统一数据对象进行复制粘贴。详细的统一数据对象请见[标准化数据通路](../../reference/apis-arkdata/js-apis-data-unifiedDataChannel.md)文档介绍。 79 80剪贴板支持使用基础数据类型进行复制粘贴,当前支持的基础数据类型有文本、HTML。ArkTS接口与NDK接口支持数据类型不完全一致,使用时须匹配接口支持类型。 81 82### 接口说明 83 84详细接口见[接口文档](../../reference/apis-basic-services-kit/js-apis-pasteboard.md#getunifieddata12)。 85 86| 名称 | 说明 | 87| -------- |----------------------------------------------------------------------------------------------------------------------------------------| 88| setUnifiedData(data: udc.UnifiedData): Promise\<void\> | 将统一数据对象的数据写入系统剪贴板。 89| setUnifiedDataSync(data: udc.UnifiedData): void | 将统一数据对象的数据写入系统剪贴板,此接口为同步接口。 | 90| getUnifiedData(): Promise\<udc.UnifiedData\> | 从系统剪贴板中读取统一数据对象的数据。 | 91| getUnifiedDataSync(): udc.UnifiedData | 从系统剪贴板中读取统一数据对象的数据,此接口为同步接口。 92 93### 示例代码 94```ts 95import {unifiedDataChannel, uniformTypeDescriptor} from '@kit.ArkData'; 96import {BusinessError, pasteboard} from '@kit.BasicServicesKit'; 97 98// 构造一条PlainText数据,并书写获取延时数据的函数。 99let plainTextData = new unifiedDataChannel.UnifiedData(); 100let GetDelayPlainText = ((dataType:string) => { 101 let plainText = new unifiedDataChannel.PlainText(); 102 plainText.details = { 103 Key: 'delayPlaintext', 104 Value: 'delayPlaintext', 105 }; 106 plainText.textContent = 'delayTextContent'; 107 plainText.abstract = 'delayTextContent'; 108 plainTextData.addRecord(plainText); 109 return plainTextData; 110}); 111 112// 向系统剪贴板中存入一条PlainText数据。 113let SetDelayPlainText = (() => { 114 plainTextData.properties.shareOptions = unifiedDataChannel.ShareOptions.CROSS_APP; 115 // 跨应用使用时设置为CROSS_APP,本应用内使用时设置为IN_APP 116 plainTextData.properties.getDelayData = GetDelayPlainText; 117 pasteboard.getSystemPasteboard().setUnifiedData(plainTextData).then(()=>{ 118 // 存入成功,处理正常场景 119 }).catch((error: BusinessError) => { 120 // 处理异常场景 121 }); 122}) 123 124// 从系统剪贴板中读取这条text数据 125let GetPlainTextUnifiedData = (() => { 126 pasteboard.getSystemPasteboard().getUnifiedData().then((data) => { 127 let outputData = data; 128 let records = outputData.getRecords(); 129 if (records[0].getType() == uniformTypeDescriptor.UniformDataType.PLAIN_TEXT) { 130 let record = records[0] as unifiedDataChannel.PlainText; 131 console.log('GetPlainText success, type:' + records[0].getType + ', details:' + 132 JSON.stringify(record.details) + ', textContent:' + record.textContent + ', abstract:' + record.abstract); 133 } else { 134 console.log('Get Plain Text Data No Success, Type is: ' + records[0].getType()); 135 } 136 }).catch((error: BusinessError) => { 137 //处理异常场景 138 }) 139}) 140``` 141 142<!--RP1--> 143<!--RP1End-->