1.介绍
HarmonyOS提供系统剪贴板服务的操作接口,支持用户程序从系统剪贴板中读取、写入和查询剪贴板数据,以及添加、移除系统剪贴板数据变化的回调。
设备内:
用户通过系统剪贴板服务,可实现应用之间的简单数据传递。例如:在应用A中复制的数据,可以在应用B中粘贴,反之亦可。
设备间:
在分布式粘贴板场景中,粘贴的数据可以跨设备写入。例如,设备A上的应用程序使用系统粘贴板接口将从设备A复制的数据通过IDL接口存储到设备B的系统粘贴板中。如果数据允许,设备B上的应用程序可以读取并粘贴系统粘贴板中的复制数据。实现设备之间粘贴板的分布式协同。
基于以上理解,实现一个分布式粘贴板应用程序,应用程序分为客户端(copy)和服务端(paste)两部分,通过idl实现数据传递。
客户端负责数据采集,服务端负责数据的展示和应用,客户端和服务端可以安装在同一台设备中,也可以安装在不同的设备中,服务端也可以按照在多台设备中,服务端通过分布式数据库实现粘贴板数据的自动同步。
2.效果展示
3.搭建环境
安装DevEco Studio, 详情请参考DevEco Studio下载。
设置DevEco Studio开发环境,DevEco Studio开发环境需要依赖于网络环境,需要连接上网络才能确保工具的正常使用,可以根据如下两种情况来配置开发环境:
如果可以直接访问Internet,只需进行下载HarmonyOS SDK操作。 如果网络不能直接访问Internet,需要通过代理服务器才可以访问,请参考配置开发环境。 下载源码后,使用DevEco Studio 打开项目,模拟器运行即可。 真机运行需要将config.json中的buddleName修改为自己的,如果没有请到AGC上进行配置,参见 使用模拟器进行调试 。
4.项目结构
5.代码讲解
5.1 系统粘贴板基础功能介绍
系统粘贴板对象介绍
1.SystemPasteboard //系统粘贴板对象,定义系统粘贴板操作,包括复制、粘贴和设置粘贴板内容更改的侦听器。
2.PasteData//表示粘贴板上的粘贴数据。
3.PasteData.DataProperty //该类定义了系统粘贴板上 PasteData 的属性,包括时间戳、MIME 类型和其他属性数据。
4.PasteData.Record//该类将单个粘贴的数据定义为 Record,它可以是纯文本、HTML 文本、URI 和意图。 PasteData 对象包含一个或多个记录。
客户端(copy)CopyAbilitySlice.java
获取系统粘贴板,监听粘贴板数据变化
/**
* 获取系统粘贴板
* 监听粘贴板数据变化
*/
private void initPasteboard() {
HiLog.debug(LABEL, "initPasteboard");
//获取系统粘贴板对象
pasteboard = SystemPasteboard.getSystemPasteboard(this);
//监听粘贴板数据变化
pasteboard.addPasteDataChangedListener(() -> {
if (pasteboard.hasPasteData()) {
sync_text = getPasteData();
HiLog.debug(LABEL, "%{public}s", "pasteStr:" + sync_text);
}
});
}
获取粘贴板内容
/**
* 获取粘贴板记录
*
* @return
*/
private String getPasteData() {
HiLog.debug(LABEL, "getPasteData");
String result = "";
//粘贴板数据对象
PasteData pasteData = pasteboard.getPasteData();
if (pasteData == null) {
return result;
}
PasteData.DataProperty dataProperty = pasteData.getProperty();
//
boolean hasHtml = dataProperty.hasMimeType(PasteData.MIMETYPE_TEXT_HTML);
boolean hasText = dataProperty.hasMimeType(PasteData.MIMETYPE_TEXT_PLAIN);
//数据格式类型
if (hasHtml || hasText) {
for (int i = 0; i < pasteData.getRecordCount(); i++) {
//粘贴板数据记录
PasteData.Record record = pasteData.getRecordAt(i);
//不同类型获取方式不同
String mimeType = record.getMimeType();
//HTML文本
if (mimeType.equals(PasteData.MIMETYPE_TEXT_HTML)) {
result = record.getHtmlText();
//纯文本
} else if (mimeType.equals(PasteData.MIMETYPE_TEXT_PLAIN)) {
result = record.getPlainText().toString();
//
} else {
HiLog.info(LABEL, "%{public}s", "getPasteData mimeType :" + mimeType);
}
}
}
return result;
}
设置文本到粘贴板中
/**
* 设置文本到粘贴板
*
* @param component
*/
private void setTextToPaste(Component component) {
HiLog.info(LABEL, "setTextToPaste");
if (pasteboard != null) {
String text = syncText.getText();
if (text.isEmpty()) {
showTips(this, "请填写内容");
return;
}
//把记录添加到粘贴板
PasteData pasteData= PasteData.creatPlainTextData(text);
//设置文本到粘贴板
pasteboard.setPasteData(pasteData)