OpenHarmony开发者论坛
标题:
OpenHarmony系统之剪切板应用Sample介绍
[打印本页]
作者:
深开鸿_赵军霞
时间:
2024-6-20 16:42
标题:
OpenHarmony系统之剪切板应用Sample介绍
[md]```
# OpenHarmony系统之剪切板应用Sample介绍
## 介绍
本示例主要使用[@ohos.pasteboard](
https://gitee.com/openharmony/do ... -apis-pasteboard.md
) 展示了剪贴板的能力,包括基础功能、支持查询剪贴板数据类型、支持查询剪贴板数据是否来自跨设备、使用系统安全控件读取剪贴板、通过ctrl v访问剪贴板数据。
## 应用场景
### 场景一:基础功能场景
#### 数据复制
* 输入:复制
* 处理:将数据写入剪贴板
* 输出:复制成功
### 数据粘贴
* 输入:粘贴
* 处理:读取剪贴板数据
* 输出:粘贴成功
### 场景二:查询剪贴板文本数据类型
* 输入:仅文本粘贴
* 处理:查询剪贴板是否有文本类型数据 hasDataType
* 输出:有数据则粘贴成功
### 场景三:查询剪贴板数据是否来自跨设备
* 输入:仅跨设备粘贴
* 处理:查询剪贴板数据是否来自跨设备
* 输出:有则粘贴成功
### 场景四:通过安全控件的粘贴按钮访问剪贴板数据
* 输入:安全控件粘贴
* 处理:集成安全控件的粘贴控件,通过粘贴控件访问剪贴板数据
* 输出:粘贴成功
### 场景五:通过ctrl v访问剪贴板数据
* 输入:外接键盘,按ctrl + v
* 处理:默认实现
* 输出:粘贴成功
## 环境
1. 本示例仅支持标准系统上运行,支持设备:RK3568。
2. 本示例为Stage模型,仅支持API12版本SDK,SDK版本号(API Version 12 Release),镜像版本号(OpenHarmony 5.0.0.25及更高版本)。
3. 本示例需要使用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);
});
}
})
### 界面展示
![first.png](
https://forums-obs.openharmony.c ... q3kdbb332dz00nt.png
"first.png")
### 使用方法
1. 在主界面,应用第一次安装时,弹出剪切板授权请求,点击“仅本次允许”进行用户授权;
2. 在主界面,文本框中输入文本,点击“复制”按钮,文本内容即可由文本框拷贝到剪切板;
3. 在主界面,点击“粘贴”按钮,文本内容即可由剪切板到文本框;
4. 在主界面,点击“文本粘贴”按钮,文本类型的内容即可由剪切板到文本框;
5. 在主界面,点击粘贴控件,文本类型的内容即可由剪切板到文本框;
6. 在主界面,点击"跨设备粘贴"按钮,可将跨设备剪切板中的内容到文本框;
7. 设备外接键盘,焦点放在文本框中,点击ctrl+v,文本内容即可由剪切板到文本框;
## 相关权限
[ohos.permission.READ_PASTEBOARD](
https://gitee.com/openharmony/do ... sionread_pasteboard
) 允许应用访问剪贴板
## 总结
剪贴板是操作系统中文本编辑常用功能,希望能给大家以帮助。
```
[/md]
欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/)
Powered by Discuz! X3.5