作者:赵军霞

介绍

本示例主要使用@ohos.pasteboard 展示了剪贴板的能力,包括基础功能、支持查询剪贴板数据类型、支持查询剪贴板数据是否来自跨设备、使用系统安全控件读取剪贴板、通过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

使用方法

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

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

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

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

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

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

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

相关权限

ohos.permission.READ_PASTEBOARD 允许应用访问剪贴板

总结

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

本文作者:深开鸿

想了解更多关于鸿蒙的内容,请访问:​

​51CTO鸿蒙开发者社区

​https://ost.51cto.com/#bkwz​