0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鸿蒙OS 剪贴板开发指导

王程 2024-01-31 15:46 次阅读

场景介绍

同一设备的应用程序 A、B 之间可以借助系统剪贴板服务完成简单数据的传递,即应用程序 A 向剪贴板服务写入数据后,应用程序 B 可以从中读取出数据。在满足分布式剪贴板服务的使用条件时,应用程序 A、B 也可以来自组网内的不同设备。

wKgaomW3dAWAD53fAAB8q3nBoAc664.png

图1 剪贴板服务示意图

在使用剪贴板服务时,需要注意以下几点:

  • 只有在前台获取到焦点的应用才有读取系统剪贴板的权限(系统默认输入法应用除外)。
  • 写入到剪贴板服务中的剪贴板数据不会随应用程序结束而销毁。
  • 对同一用户而言,写入剪贴板服务的数据会被下一次写入的剪贴板数据所覆盖。
  • 如果设备满足分布式组网条件,且进行复制操作的设备打开了剪贴板分布式开关,未配置“仅在本地”标志位的剪贴板数据里的 MIME 类型为纯文本和 HTML 的内容可以被组网内其他打开了剪贴板分布式开关的设备粘贴出来。
  • 在同一设备内,剪贴板单次传递内容不应超过 800KB。在分布式场景下多设备间传递时,每次传递内容不应超过 64KB。

接口说明

SystemPasteboard 提供系统剪贴板操作的相关接口,比如复制、粘贴、配置回调等。PasteData 是剪贴板服务操作的数据对象,一个 PasteData 由若干个内容节点(PasteData.Record)和一个属性集合对象(PasteData.DataProperty)组成。Record 是存放剪贴板数据内容信息的最小单位,每个 Record 都有其特定的 MIME 类型,如纯文本、HTML、URI、Intent。剪贴板数据的属性信息存在放 DataProperty 中,包括标签、时间戳、“仅在本地”标记位等。

  • SystemPasteboard

SystemPasteboard 提供系统剪贴板服务的操作接口,比如复制、粘贴、配置回调等。

接口名 描述
getSystemPasteboard(Context context) 获取系统剪切板服务的对象实例。
getPasteData() 读取当前系统剪贴板中的数据。
hasPasteData() 判断当前系统剪贴板中是否有内容。
setPasteData(PasteData data) 将剪贴板数据写入到系统剪贴板。
clear() 判断当前系统剪贴板中是否有内容。清空系统剪贴板数据。
addPasteDataChangedListener(IPasteDataChangedListener listener) 用户程序添加系统剪贴板数据变化的回调,当系统剪贴板数据发生变化时,会触发用户程序的回调实现。
removePasteDataChangedListener(IPasteDataChangedListener listener) 用户程序移除系统剪贴板数据变化的回调。
  • PasteData

PasteData 是剪贴板服务操作的数据对象,其中内容节点定义为 PasteData.Record,属性集合定义为 PasteData.DataProperty。

接口名 描述
PasteData() 构造器,创建一个空内容数据对象。
createPlainTextData(CharSequence text) 构建一个包含纯文本内容节点的数据对象。
creatHtmlData(String htmlText) 构建一个包含 HTML 内容节点的数据对象。
creatUriData(Uri uri) 构建一个包含 URI 内容节点的数据对象。
creatIntentData(Intent intent) 构建一个包含 Intent 内容节点的数据对象。
getPrimaryMimeType() 获取数据对象中首个内容节点的 MIME 类型,如果没有查询到内容,将返回一个空字符串。
getPrimaryText() 获取数据对象中首个内容节点的纯文本内容,如果没有查询到内容,将返回一个空对象。
addTextRecord(CharSequence text) 向数据对象中添加一个纯文本内容节点,该方法会自动更新数据属性中的MIME类型集合,最多只能添加 128 个内容节点。
addRecord(Record record) 向数据对象中添加一个内容节点,该方法会自动更新数据属性中的 MIME 类型集合,最多只能添加 128 个内容节点。
getRecordCount() 获取数据对象中内容节点的数量。
getRecordAt(int index) 获取数据对象在指定下标处的内容节点,如果操作失败会返回空对象。
removeRecordAt(int index) 移除数据对象在指定下标处的内容节点,如果操作成功会返回 true,操作失败会返回 false。
getMimeTypes() 获取数据对象中上所有内容节点的MIME类型列表,当内容节点为空时,返回列表为空对象。
getProperty() 获取该数据对象的属性集合成员。
常量名 描述
MIMETYPE_TEXT_PLAIN= “text/plain” 纯文本的 MIME 类型定义。
MIMETYPE_TEXT_HTML= “text/html” HTML的 MIM E类型定义。
MIMETYPE_TEXT_URI= “text/uri” URI的 MIME 类型定义。
MIMETYPE_TEXT_INTENT= “text/ohos.intent” Intent的 MIME 类型定义。
MAX_RECORD_NUM=128 单个 PasteData 中所能包含的 Record 的数量上限。
  • PasteData.Record

一个 PasteData 中包含若干个特定MIME类型的 PasteData.Record,每个 Record 是存放剪贴板数据内容信息的最小单位。

接口名 描述
createPlainTextRecord(CharSequence text) 构造一个 MIME 类型为纯文本的内容节点。
createHtmlTextRecord(String htmlText) 构造一个 MIME 类型为HTML的内容节点。
createUriRecord(Uri uri) 构造一个 MIME 类型为URI的内容节点。
createIntentRecord(Intent intent) 构造一个 MIME 类型为Intent的内容节点。
getPlainText() 获取该内容节点中的文本内容,如果没有内容将返回空对象。
getHtmlText() 获取该内容节点中的 HTML 内容,如果没有内容将返回空对象。
getUri() 获取该内容节点中的 URI 内容,如果没有内容将返回空对象。
getIntent() 获取该内容节点中的 Intent 内容,如果没有内容将返回空对象。
getMimeType() 获取该内容节点的 MIME 类型。
convertToText(Context context) 将该内容节点的内容转为文本形式。
  • PasteData.DataProperty

每个 PasteData 中都有一个 PasteData.DataProperty 成员,其中存放着该数据对象的属性集合,例如自定义标签、MIME 类型集合列表,“仅在本地”标记位等。

接口名 描述
getMimeTypes() 获取所属数据对象的 MIME 类型集合列表,当内容节点为空时,返回列表为空对象。
hasMimeType(String mimeType) 判断所属数据对象中是否包含特定 MIME类型的内容。
getTimestamp() 获取所属数据对象被写入系统剪贴板时的时间戳,如果该数据对象尚未被写入,则返回0。
setTag(CharSequence tag) 设置自定义标签。
getTag() 获取自定义标签。
setAdditions(PacMap extraProps) 设置一些附加键值对信息
getAdditions() 获取附加键值对信息。
setLocalOnly(boolean isLocalonly) 配置“仅在本地”标志位,默认配置为false,表示此数据对象能在分布式剪贴板场景下跨设备传递,否则只在本地设备使用。
isLocalOnly() 查询“仅在本地”标志位。
  • IPasteDataChangedListener

IPasteDataChangedListener 是定义剪贴板数据变化回调的接口类,开发者需要实现此接口来编码触发回调时的处理逻辑。

接口名 描述
onChanged() 当系统剪贴板数据发生变化时的回调接口。

开发步骤

  • 应用A获取系统剪贴板服务。
SystemPasteboard pasteboard = SystemPasteboard.getSystemPasteboard(appContext);
  • 应用A向系统剪贴板中写入一条纯文本数据。
 if (pasteboard != null) {
       pasteboard.setPasteData(PasteData.creatPlainTextData("Hello, world!"));
   }
  • 应用 B 从系统剪贴板读取数据,将数据对象中的首个文本类型(纯文本/HTML)内容信息在控件中显示,忽略其他类型内容。
 PasteData pasteData = pasteboard.getPasteData();
   if (pasteData == null) {
       return;
   }
   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++) {
           Record record = pasteData.getRecordAt(i);
           String mimeType = record.getMimeType();
           if (mimeType.equals(PasteData.MIMETYPE_TEXT_HTML)) {
               text.setText(record.getHtmlText());
               break;
           } else if (mimeType.equals(PasteData.MIMETYPE_TEXT_PLAIN)) {
               text.setText(record.getPlainText().toString());
               break;
           }
       }
   }
  • 应用 C 注册添加系统剪贴板数据变化回调,当系统剪贴板数据发生变化时触发处理逻辑。
   IPasteDataChangedListener listener = new IPasteDataChangedListener() {
       @Override
       public void onChanged() {
           PasteData pasteData = pasteboard.getPasteData();
           if (pasteData == null) {
               return;
           }
           // Operations to handle data change on the system pasteboard
       }
   };
   pasteboard.addPasteDataChangedListener(listener);·
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 鸿蒙
    +关注

    关注

    57

    文章

    2325

    浏览量

    42764
  • HarmonyOS
    +关注

    关注

    79

    文章

    1968

    浏览量

    30058
收藏 人收藏

    评论

    相关推荐

    labview利用调用节点从剪贴板获取图像生成EXE文件无法使用

    labview利用调用节点从剪贴板获取图像生成EXE文件时无法使用,这是什么原因呢,怎么改呢
    发表于 06-06 22:17

    HarmonyOS应用开发-剪贴板功能实现

    粘贴版是一个常用的功能,用户通过系统剪贴板服务,可实现应用之间的简单数据传递。例如:在应用A中复制的数据,可以在应用B中粘贴,反之亦可。效果如图: 关键代码如下:public class
    发表于 03-30 10:48

    OpenHarmony 3.1 Release最全资料免费获取

    对静态壁纸管理能力的支持  - 新增对下载服务管理能力的支持  主要涉及如下需求:  I4U2WR 新增特性:时间时区同步管理  I4ZTTE【新增特性】剪贴板数据项-支持将剪贴板数据项强制转换为文本
    发表于 03-31 14:23

    基于GoKit的产品开发指导

    基于GoKit的产品开发指导,有板子的可以下载看看的
    发表于 11-16 19:00 0次下载

    ZigBee2007视频教程-应用开发指导

    ZigBee2007视频教程-应用开发指导ZigBee2007视频教程-应用开发指导ZigBee2007视频教程-应用开发指导ZigBee2007视频教程-应用开发指导
    发表于 12-29 10:31 19次下载

    JAVA教程之使用剪贴板的复制粘贴程序

    JAVA教程之使用剪贴板的复制粘贴程序,很好的学习资料。
    发表于 03-31 11:13 5次下载

    Delphi教程之监视剪贴板

    Delphi教程之监视剪贴板,很好的Delphi资料,快来下载吧。
    发表于 04-11 16:09 9次下载

    小米手机和PC的共享剪贴板上线,PC端装云服务客户端就OK

    刘鸣称:“看到有用户在要共享剪贴板,其实我们已经支持了,只需要电脑端装小米云服务客户端就可以了。”
    的头像 发表于 11-24 09:09 7643次阅读

    苹果iOS应用程序不经过用户同意读取剪贴板数据

    据Macrumors报道,最新研究显示数十种流行的iOS应用程序,在未经用户同意的情况下,读取剪贴板的内容,其中可能包含敏感信息。
    的头像 发表于 03-16 09:19 2818次阅读

    iOS 14的隐私功能显示了复制到剪贴板的TikTok阅读文本

    开发人员开始下载并使用iOS 14 beta版,他们发现流行的视频共享平台TikTok是读取用户复制到剪贴板的文本的应用程序之一。从下面的视频中可以看到,在TikTok应用程序打开时,苹果的新隐私警告继续出现在屏幕上。
    的头像 发表于 07-03 16:33 2321次阅读

    HarmonyOS应用开发案例 剪贴板功能实现

    粘贴版是一个常用的功能,用户通过系统剪贴板服务,可实现应用之间的简单数据传递。例如:在应用A中复制的数据,可以在应用B中粘贴,反之亦可。 效果如图: 关键代码如下: public class
    的头像 发表于 03-30 10:41 1221次阅读
    HarmonyOS应用<b class='flag-5'>开发</b>案例 <b class='flag-5'>剪贴板</b>功能实现

    ADP1074: 带有活性剪贴板和 <span class="analog-coupler" >i </span> Cloupler数据表的孤立、同步前向控制器 ADI

    电子发烧友网为你提供ADI(ADI)ADP1074: 带有活性剪贴板和 i
    发表于 10-08 16:41
    ADP1074: 带有活性<b class='flag-5'>剪贴板</b>和 <span class="analog-coupler" >i </span> Cloupler数据表的孤立、同步前向控制器 ADI

    怎么将剪贴板数据导入到labview数组

    剪贴板数据导入到LabVIEW数组可以通过以下步骤完成。首先,需要使用LabVIEW自带的函数库VIs来实现剪贴板数据的获取和处理。 第一步是获取剪贴板数据。LabVIEW提供了Clipboard
    的头像 发表于 01-05 13:35 1367次阅读

    鸿蒙开发系统基础能力:ohos.pasteboard 剪贴板

    以下各项对应的系统能力均为SystemCapability.MiscServices.Pasteboard。
    的头像 发表于 06-26 16:48 364次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b>系统基础能力:ohos.pasteboard <b class='flag-5'>剪贴板</b>

    鸿蒙开发Ability Kit程序访问控制:使用粘贴控件

    粘贴控件是一种特殊的系统安全控件,它允许应用在用户的授权下无提示地读取剪贴板数据。
    的头像 发表于 07-03 09:15 293次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b>Ability Kit程序访问控制:使用粘贴控件