• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 使用剪贴板进行复制粘贴 (C/C++)
2<!--Kit: Basic Services Kit-->
3<!--Subsystem: MiscServices-->
4<!--Owner: @yangxiaodong41-->
5<!--Designer: @guo867-->
6<!--Tester: @maxiaorong2-->
7<!--Adviser: @fang-jinxu-->
8
9## 场景介绍
10
11剪贴板为开发者提供数据的复制粘贴能力。支持对纯文本、超文本、URI等内容的操作。
12
13## 基本概念
14
15- [**OH_PasteboardObserver**](../../reference/apis-basic-services-kit/capi-pasteboard-oh-pasteboardobserver.md):剪贴板数据变更观察者对象,用以监听剪贴板数据变更事件。
16- [**OH_Pasteboard**](../../reference/apis-basic-services-kit/capi-pasteboard-oh-pasteboard.md):剪贴板对象,用来进行查询、写入等操作。
17- [**OH_UdmfData**](../../reference/apis-arkdata/capi-udmf-oh-udmfdata.md):统一数据对象。
18
19## 约束限制
20
21- 剪贴板内容包含剪贴板系统服务元数据和应用设置的数据,总大小上限默认为128MB,PC/2in1设备可通过系统配置修改上限,有效范围为128MB~2GB。
22- 为保证剪贴板数据的准确性,同一时间只能支持一个复制操作。
23- 当前支持的数据类型:纯文本类型(OH_UdsPlainText)、超文本标记语言类型(OH_UdsHtml)、文件Uri类型(OH_UdsFileUri)、像素图片类型(OH_UdsPixelMap)、超链接类型(OH_UdsHyperlink)、桌面图标类型(OH_UdsAppItem)、自定义类型。ArkTS接口与NDK接口支持数据类型不完全一致,使用时须匹配接口支持类型,详情见[ArkTS与NDK接口数据类型对应关系](../pasteboard/use_pasteboard_to_copy_and_paste.md)。
24- 自定义类型数据在复制粘贴时,指定的类型名称不能和已有的类型名称重复。
25- API version 12及之后,系统为提升用户隐私安全保护能力,剪贴板读取接口增加[权限管控](get-pastedata-permission-guidelines.md)。
26- API version 12中新增的复制、粘贴接口[setUnifiedData](../../reference/apis-basic-services-kit/js-apis-pasteboard.md#setunifieddata12)/[getUnifiedData](../../reference/apis-basic-services-kit/js-apis-pasteboard.md#getunifieddata12),和本文档中的复制、粘贴接口`OH_Pasteboard_SetData`/`OH_Pasteboard_GetData`,当前相互独立,进行写入、读取操作时请使用对应配套接口。
27
28## 接口说明
29
30详细接口见[Pasteboard文档](../../reference/apis-basic-services-kit/capi-pasteboard.md)。
31
32| 接口名称                                                     | 描述                                                    |
33| ------------------------------------------------------------ | ------------------------------------------------------- |
34| OH_PasteboardObserver* OH_PasteboardObserver_Create()        | 创建一个剪贴板数据变更观察者对象。                      |
35| OH_PasteboardObserver_Destroy(OH_PasteboardObserver* observer) | 销毁剪贴板数据变更观察者对象。                          |
36| int OH_PasteboardObserver_SetData(OH_PasteboardObserver* observer, void* context, const Pasteboard_Notify callback, const Pasteboard_Finalize finalize) | 将剪贴板变更回调函数设置到剪贴板数据变更观察者对象中。  |
37| OH_Pasteboard* OH_Pasteboard_Create()                        | 创建一个剪贴板实例。                                    |
38| void OH_Pasteboard_Destroy(OH_Pasteboard* pasteboard)        | 销毁剪贴板实例。                                        |
39| int OH_Pasteboard_Subscribe(OH_Pasteboard* pasteboard, int type, const OH_PasteboardObserver* observer) | 订阅剪贴板的数据变更。                                  |
40| int OH_Pasteboard_Unsubscribe(OH_Pasteboard* pasteboard, int type, const OH_PasteboardObserver* observer) | 取消对剪贴板数据变更的订阅。                            |
41| bool OH_Pasteboard_IsRemoteData(OH_Pasteboard* pasteboard)   | 判断剪贴板中的数据是否来自远端设备。                    |
42| int OH_Pasteboard_GetDataSource(OH_Pasteboard* pasteboard, char* source, unsigned int len) | 获取剪贴板中数据的数据源。                              |
43| bool OH_Pasteboard_HasType(OH_Pasteboard* pasteboard, const char* type) | 判断剪贴板中是否有指定类型的数据。                      |
44| bool OH_Pasteboard_HasData(OH_Pasteboard* pasteboard)        | 检查剪贴板中是否有数据。                                |
45| OH_UdmfData* OH_Pasteboard_GetData(OH_Pasteboard* pasteboard, int* status) | 获取剪贴板中的数据。                                    |
46| int OH_Pasteboard_SetData(OH_Pasteboard* pasteboard, OH_UdmfData* data) | 向剪贴板中写入数据。                                    |
47| int OH_Pasteboard_ClearData(OH_Pasteboard* pasteboard)       | 清空剪贴板中的数据。                                    |
48| void (\*Pasteboard_Notify)(void\* context, Pasteboard_NotifyType type) | 剪贴板中数据变更回调函数。                              |
49| void (\*Pasteboard_Finalize)(void\* context)                 | 剪贴板数据变更观察者对象销毁时,释放context上下文资源。 |
50
51## 开发步骤
52
531. 添加动态链接库。
54
55   ```CMake
56   # CMakeLists.txt中添加以下lib
57   libudmf.so
58   libpasteboard.so
59   ```
60
612. 引用头文件。
62
63   ```c
64   #include <cstdio>
65   #include <database/pasteboard/oh_pasteboard.h>
66   #include <database/udmf/udmf.h>
67   #include <database/udmf/uds.h>
68   ```
69
703. 定义剪贴板变化监听的回调函数。
71
72   ```c
73   // 定义剪贴板数据内容变更时的通知回调函数
74   static void Pasteboard_Notify_impl2(void* context, Pasteboard_NotifyType type)
75   {
76     printf("Pasteboard_NotifyType, type: %d", type);
77   }
78   // 定义剪贴板数据变更观察者对象销毁时的通知回调函数
79   static void Pasteboard_Finalize_impl2(void* context)
80   {
81     printf("callback: Pasteboard_Finalize");
82   }
83   ```
84
854. 订阅剪贴板变化。
86
87   ```c
88   // 1. 创建一个剪贴板实例
89   OH_Pasteboard* pasteboard = OH_Pasteboard_Create();
90   // 2. 创建一个剪贴板数据变更观察者实例
91   OH_PasteboardObserver* observer = OH_PasteboardObserver_Create();
92   // 3. 将两个回调函数设置到观察者实例
93   OH_PasteboardObserver_SetData(observer, (void* )pasteboard, Pasteboard_Notify_impl2, Pasteboard_Finalize_impl2);
94   // 4. 设置对剪贴板本端数据变化的订阅
95   OH_Pasteboard_Subscribe(pasteboard, NOTIFY_LOCAL_DATA_CHANGE, observer);
96   ```
97
985. 向剪贴板写入数据。
99
100   ```c
101   // 1. 创建一个剪贴板实例
102   OH_Pasteboard* pasteboard = OH_Pasteboard_Create();
103
104   // 2. 创建OH_UdmfRecord对象,并向OH_UdmfRecord中添加文本类型数据
105   OH_UdsPlainText* plainText = OH_UdsPlainText_Create();
106   OH_UdsPlainText_SetContent(plainText, "Hello world!");
107   OH_UdmfRecord* record = OH_UdmfRecord_Create();
108   OH_UdmfRecord_AddPlainText(record, plainText);
109
110   // 3. 创建OH_UdmfData对象,并向OH_UdmfData中添加OH_UdmfRecord
111   OH_UdmfData* data = OH_UdmfData_Create();
112   OH_UdmfData_AddRecord(data, record);
113
114   // 4. 将数据写入剪贴板
115   OH_Pasteboard_SetData(pasteboard, data);
116
117   // 5. 使用完销毁指针
118   OH_UdsPlainText_Destroy(plainText);
119   OH_UdmfRecord_Destroy(record);
120   OH_UdmfData_Destroy(data);
121   OH_Pasteboard_Destroy(pasteboard);
122   ```
123
1246. 从剪贴板读取数据。
125
126   ```c
127   // 1. 创建一个剪贴板实例
128   OH_Pasteboard* pasteboard = OH_Pasteboard_Create();
129   // 2. 判断剪贴板中是否有文本类型数据
130   bool hasPlainTextData = OH_Pasteboard_HasType(pasteboard, "text/plain");
131   if (hasPlainTextData) {
132     // 3. 从剪贴板中获取统一类型数据OH_UdmfData
133     int ret = 0;
134     OH_UdmfData* udmfData = OH_Pasteboard_GetData(pasteboard, &ret);
135     // 4. 从OH_UdmfData中获取第一个数据记录
136     OH_UdmfRecord* record = OH_UdmfData_GetRecord(udmfData, 0);
137     // 5. 从数据记录中获取文本数据内容
138     OH_UdsPlainText* plainText = OH_UdsPlainText_Create();
139     OH_UdmfRecord_GetPlainText(record, plainText);
140     const char* content = OH_UdsPlainText_GetContent(plainText);
141     printf("Get plain text success. content: %s", content);
142     // 5. 使用完销毁指针
143     OH_UdsPlainText_Destroy(plainText);
144     OH_UdmfData_Destroy(udmfData);
145   }
146   OH_Pasteboard_Destroy(pasteboard);
147   ```
148