作者:赵军霞
介绍
本示例主要使用@ohos.pasteboard 展示了剪贴板的能力,包括基础功能、支持查询剪贴板数据类型、支持查询剪贴板数据是否来自跨设备、使用系统安全控件读取剪贴板、通过ctrl v访问剪贴板数据。
应用场景
场景一:基础功能场景
数据复制
- 输入:复制
- 处理:将数据写入剪贴板
- 输出:复制成功
数据粘贴
-
输入:粘贴
-
处理:读取剪贴板数据
-
输出:粘贴成功
场景二:查询剪贴板文本数据类型
- 输入:仅文本粘贴
- 处理:查询剪贴板是否有文本类型数据 hasDataType
- 输出:有数据则粘贴成功
场景三:查询剪贴板数据是否来自跨设备
- 输入:仅跨设备粘贴
- 处理:查询剪贴板数据是否来自跨设备
- 输出:有则粘贴成功
场景四:通过安全控件的粘贴按钮访问剪贴板数据
- 输入:安全控件粘贴
- 处理:集成安全控件的粘贴控件,通过粘贴控件访问剪贴板数据
- 输出:粘贴成功
场景五:通过ctrl v访问剪贴板数据
- 输入:外接键盘,按ctrl + v
- 处理:默认实现
- 输出:粘贴成功
环境
-
本示例仅支持标准系统上运行,支持设备:RK3568。
-
本示例为Stage模型,仅支持API12版本SDK,SDK版本号(API Version 12 Release),镜像版本号(OpenHarmony 5.0.0.25及更高版本)。
-
本示例需要使用DevEco Studio 版本号(4.1Release)及以上版本才可编译运行。
实现效果
代码展示
数据复制
.onClick(() => {
// 复制文本框文本到剪贴板
this.addLog('text content :' + this.text);
let plainTextData = new unifiedDataChannel.UnifiedData();
let plainText = new unifiedDataChannel.PlainText();
plainText.details = {
key: 'delayPlaintext',
value: this.copyText,
};
plainText.textContent = this.copyText;
plainText.abstract = 'delayTextContent';
plainTextData.addRecord(plainText);
let systemPasteboard: pasteboard.SystemPasteboard = pasteboard.getSystemPasteboard();
systemPasteboard.setUnifiedData(plainTextData).then((data: void) => {
console.info('Succeeded in setting UnifiedData.');
}).catch((err: BusinessError) => {
console.error('Failed to set UnifiedData. Cause: ' + err.message);
});
})
数据粘贴
.onClick(() => {
// 粘贴剪贴板内容到文本框
let systemPasteboard: pasteboard.SystemPasteboard = pasteboard.getSystemPasteboard();
systemPasteboard.getUnifiedData().then((data) => {
let records = data.getRecords();
this.addLog('Button_paste records.length: ' + records.length);
for (let j = 0; j < records.length; j++) {
if (records[j].getType() === uniformTypeDescriptor.UniformDataType.PLAIN_TEXT) {
let text = records[j] as unifiedDataChannel.PlainText;
this.text = text.textContent;
this.addLog('Button_paste' + `${j + 1}.${text.textContent}`);
}
}
}).catch((err: BusinessError) => {
this.addLog('Failed to get UnifiedData. Cause: ' + err.message);
});
})
查询剪贴板文本数据类型
.onClick(() => {
// 粘贴类型过滤,仅粘贴文本
let systemPasteboard: pasteboard.SystemPasteboard = pasteboard.getSystemPasteboard();
let result: boolean = systemPasteboard.hasDataType(pasteboard.MIMETYPE_TEXT_PLAIN);
if (result) {
let systemPasteboard: pasteboard.SystemPasteboard = pasteboard.getSystemPasteboard();
systemPasteboard.getUnifiedData().then((data) => {
let records = data.getRecords();
for (let j = 0; j < records.length; j++) {
if (records[j].getType() === uniformTypeDescriptor.UniformDataType.PLAIN_TEXT) {
let text = records[j] as unifiedDataChannel.PlainText;
this.text = text.textContent;
this.addLog('Button_text_paste' + `${j + 1}.${text.textContent}`);
}
}
}).catch((err: BusinessError) => {
this.addLog('Failed to get UnifiedData. Cause: ' + err.message);
});
} else {
this.addLog('Check the PLAIN_TEXT DataType fail!')
}
})
查询剪贴板数据是否来自跨设备
.onClick(() => {
// 粘贴类型过滤,仅跨设备文本
let systemPasteboard: pasteboard.SystemPasteboard = pasteboard.getSystemPasteboard();
let result: boolean = systemPasteboard.isRemoteData();
if (result) {
let systemPasteboard: pasteboard.SystemPasteboard = pasteboard.getSystemPasteboard();
systemPasteboard.getUnifiedData().then((data) => {
let records = data.getRecords();
for (let j = 0; j < records.length; j++) {
if (records[j].getType() === uniformTypeDescriptor.UniformDataType.PLAIN_TEXT) {
let text = records[j] as unifiedDataChannel.PlainText;
this.text = text.textContent;
this.addLog('Button_device_paste' + `${j + 1}.${text.textContent}`);
}
}
}).catch((err: BusinessError) => {
this.addLog('Failed to get UnifiedData. Cause: ' + err.message);
});
} else {
this.addLog('Check isRemoteData DataType fail!');
}
})
通过安全控件的粘贴按钮访问剪贴板数据
PasteButton()
.width('45%')
.fontSize(16)
.onClick((event: ClickEvent, result: PasteButtonOnClickResult) => {
// 使用安全粘贴控件粘贴文本
this.addLog('PasteButton onclick!')
if (PasteButtonOnClickResult.SUCCESS === result) {
pasteboard.getSystemPasteboard().getData((err: BusinessError, pasteData: pasteboard.PasteData) => {
if (err) {
this.addLog(`Failed to get paste data. Code is ${err.code}, message is ${err.message}`);
return;
}
this.text = pasteData.getPrimaryText();
this.addLog('PasteButton onclick getPrimaryText: ' + this.text);
});
}
})
界面展示
使用方法
-
在主界面,应用第一次安装时,弹出剪切板授权请求,点击“仅本次允许”进行用户授权;
-
在主界面,文本框中输入文本,点击“复制”按钮,文本内容即可由文本框拷贝到剪切板;
-
在主界面,点击“粘贴”按钮,文本内容即可由剪切板到文本框;
-
在主界面,点击“文本粘贴”按钮,文本类型的内容即可由剪切板到文本框;
-
在主界面,点击粘贴控件,文本类型的内容即可由剪切板到文本框;
-
在主界面,点击"跨设备粘贴"按钮,可将跨设备剪切板中的内容到文本框;
-
设备外接键盘,焦点放在文本框中,点击ctrl+v,文本内容即可由剪切板到文本框;
相关权限
ohos.permission.READ_PASTEBOARD 允许应用访问剪贴板
总结
剪贴板是操作系统中文本编辑常用功能,希望能给大家以帮助。
本文作者:深开鸿