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