[经验分享] OpenHarmony系统之剪切板应用Sample介绍

深开鸿_赵军霞 显示全部楼层 发表于 2024-6-20 16:42:49
# OpenHarmony系统之剪切板应用Sample介绍

## 介绍
本示例主要使用[@ohos.pasteboard](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-basic-services-kit/js-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.cn/forum/202406/20/164217bq3kdbb332dz00nt.png "first.png")


### 使用方法
1. 在主界面,应用第一次安装时,弹出剪切板授权请求,点击“仅本次允许”进行用户授权;

2. 在主界面,文本框中输入文本,点击“复制”按钮,文本内容即可由文本框拷贝到剪切板;

3. 在主界面,点击“粘贴”按钮,文本内容即可由剪切板到文本框;

4. 在主界面,点击“文本粘贴”按钮,文本类型的内容即可由剪切板到文本框;

5. 在主界面,点击粘贴控件,文本类型的内容即可由剪切板到文本框;

6. 在主界面,点击"跨设备粘贴"按钮,可将跨设备剪切板中的内容到文本框;

7. 设备外接键盘,焦点放在文本框中,点击ctrl+v,文本内容即可由剪切板到文本框;


## 相关权限

[ohos.permission.READ_PASTEBOARD](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/security/AccessToken/permissions-for-system-apps.md#ohospermissionread_pasteboard) 允许应用访问剪贴板


## 总结
剪贴板是操作系统中文本编辑常用功能,希望能给大家以帮助。
无用

©著作权归作者所有,转载或内容合作请联系作者

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

Copyright   ©2023  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部