鸿蒙next教程:剪贴板开发(使用剪贴板进行复制粘贴 (C/C++))_鸿蒙开发 调用剪切板
往期鸿蒙全套实战文章必看:(附带鸿蒙全栈学习资料)
-
鸿蒙开发核心知识点,看这篇文章就够了
-
最新版!鸿蒙HarmonyOS Next应用开发实战学习路线
-
鸿蒙HarmonyOS NEXT开发技术最全学习路线指南
-
鸿蒙应用开发实战项目,看这一篇文章就够了(部分项目附源码)
使用剪贴板进行复制粘贴 (C/C++)
场景介绍
剪贴板为开发者提供数据的复制粘贴能力。支持对纯文本、超文本、URI等内容的操作。
基本概念
- OH_PasteboardObserver:剪贴板数据变更观察者对象,用以监听剪贴板数据变更事件。
- OH_Pasteboard:剪贴板对象,用来进行查询、写入等操作。
- OH_UdmfData:统一数据对象。
约束限制
- 剪贴板内容包含剪贴板系统服务元数据和应用设置的数据,总大小上限默认为128MB,PC/2in1设备可通过系统配置修改上限,有效范围为128MB~2GB。
- 为保证剪贴板数据的准确性,同一时间只能支持一个复制操作。
- 当前支持的数据类型:纯文本类型(OH_UdsPlainText)、超文本标记语言类型(OH_UdsHtml)、文件Uri类型(OH_UdsFileUri)、像素图片类型(OH_UdsPixelMap)、超链接类型(OH_UdsHyperlink)、桌面图标类型(OH_UdsAppItem)、自定义类型。JS接口与NDK接口支持数据类型不完全一致,使用时须匹配接口支持类型。
- 自定义类型数据在复制粘贴时,指定的类型名称不能和已有的类型名称重复。
- API version 12及之后,系统为提升用户隐私安全保护能力,剪贴板读取接口增加权限管控。
- API version 12中新增的复制、粘贴接口setUnifiedData/getUnifiedData,和本文档中的复制、粘贴接口OH_Pasteboard_SetData/OH_Pasteboard_GetData,当前相互独立,进行写入、读取操作时请使用对应配套接口。
接口说明
详细接口见Pasteboard文档。
开发步骤
-
添加动态链接库。
# CMakeLists.txt中添加以下liblibudmf.solibpasteboard.so
-
引用头文件。
#include #include #include #include
-
定义剪贴板变化监听的回调函数。
// 定义剪贴板数据内容变更时的通知回调函数static void Pasteboard_Notify_impl2(void* context, Pasteboard_NotifyType type){ printf(\"Pasteboard_NotifyType, type: %d\", type);}// 定义剪贴板数据变更观察者对象销毁时的通知回调函数static void Pasteboard_Finalize_impl2(void* context){ printf(\"callback: Pasteboard_Finalize\");}
-
订阅剪贴板变化。
// 1. 创建一个剪贴板实例OH_Pasteboard* pasteboard = OH_Pasteboard_Create();// 2. 创建一个剪贴板数据变更观察者实例OH_PasteboardObserver* observer = OH_PasteboardObserver_Create();// 3. 将两个回调函数设置到观察者实例OH_PasteboardObserver_SetData(observer, (void* )pasteboard, Pasteboard_Notify_impl2, Pasteboard_Finalize_impl2);// 4. 设置对剪贴板本端数据变化的订阅OH_Pasteboard_Subscribe(pasteboard, NOTIFY_LOCAL_DATA_CHANGE, observer);
-
向剪贴板写入数据。
// 1. 创建一个剪贴板实例OH_Pasteboard* pasteboard = OH_Pasteboard_Create();// 2. 创建OH_UdmfRecord对象,并向OH_UdmfRecord中添加文本类型数据OH_UdsPlainText* plainText = OH_UdsPlainText_Create();OH_UdsPlainText_SetContent(plainText, \"Hello world!\");OH_UdmfRecord* record = OH_UdmfRecord_Create();OH_UdmfRecord_AddPlainText(record, plainText);// 3. 创建OH_UdmfData对象,并向OH_UdmfData中添加OH_UdmfRecordOH_UdmfData* data = OH_UdmfData_Create();OH_UdmfData_AddRecord(data, record);// 4. 将数据写入剪贴板OH_Pasteboard_SetData(pasteboard, data);// 5. 使用完销毁指针OH_UdsPlainText_Destroy(plainText);OH_UdmfRecord_Destroy(record);OH_UdmfData_Destroy(data);OH_Pasteboard_Destroy(pasteboard);
-
从剪贴板读取数据。
// 1. 创建一个剪贴板实例OH_Pasteboard* pasteboard = OH_Pasteboard_Create();// 2. 判断剪贴板中是否有文本类型数据bool hasPlainTextData = OH_Pasteboard_HasType(pasteboard, \"text/plain\");if (hasPlainTextData) { // 3. 从剪贴板中获取统一类型数据OH_UdmfData int ret = 0; OH_UdmfData* udmfData = OH_Pasteboard_GetData(pasteboard, &ret); // 4. 从OH_UdmfData中获取第一个数据记录 OH_UdmfRecord* record = OH_UdmfData_GetRecord(udmfData, 0); // 5. 从数据记录中获取文本数据内容 OH_UdsPlainText* plainText = OH_UdsPlainText_Create(); OH_UdmfRecord_GetPlainText(record, plainText); const char* content = OH_UdsPlainText_GetContent(plainText); printf(\"Get plain text success. content: %s\", content); // 5. 使用完销毁指针 OH_UdsPlainText_Destroy(plainText); OH_UdmfData_Destroy(udmfData);}OH_Pasteboard_Destroy(pasteboard);