鸿蒙跨设备协同开发04——跨设备剪切板开发

如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!扫描下方名片,关注公众号,公众号更新更快,同时也有更多学习资料和技术讨论群。

1、概述

当用户拥有多台设备时,可以通过跨设备剪贴板的功能,在A设备的应用上复制一段文本,粘贴到B设备的应用中,高效地完成多设备间的内容共享。

剪贴板分为本地剪贴板和跨设备剪贴板,本地剪贴板提供设备内的内容复制粘贴,跨设备剪贴板提供跨设备的内容复制粘贴。

如果我们正在开发一款浏览器类应用,或是备忘录、笔记、邮件等富文本编辑类应用时,均可接入跨设备剪贴板,提升用户体验。

过程示意如下:

图片

使用跨设备剪切板能力有以下几点条件需要注意:

  1. 双端设备需要登录同一华为账号。

  2. 双端设备需要打开Wi-Fi和蓝牙开关。

  3. 条件允许时,建议双端设备接入同一个局域网,可提升数据传输的速度。

  4. 双端设备在过程中需解锁、亮屏。

2、API介绍

涉及到跨设备剪切板的几个核心API如下:

👉🏻 获取系统剪切板对象

getSystemPasteboard(): SystemPasteboard// SystemPasteboard是系统剪切板对象。定义如下:class SystemPasteboard {// 监听或取消监听系统剪切板内容b变化事件+ on(type: 'update', callback: () =>void ): void;+ off(type: 'update', callback?: () =>void ): void// 清空系统剪贴板内容+ clearData(callback: AsyncCallback<void>): void+ clearData(): Promise<void>// 将数据写入系统剪贴板+ setData(data: PasteData, callback: AsyncCallback<void>): void+ setData(data: PasteData): Promise<void>// 读取系统剪贴板内容+ getData( callback: AsyncCallback<PasteData>): void+ getData(): Promise<PasteData>// 判断系统剪贴板中是否有内容+ hasData(callback: AsyncCallback<boolean>): void+ hasData(): Promise<boolean>// 判断剪贴板中的数据是否来自其他设备。+ isRemoteData(): boolean// 获取数据来源+getDataSource(): string// 检查剪贴板内容中是否有指定类型的数据。+ hasDataType(mimeType: string): boolean// 读取系统剪贴板内容+ getUnifiedData(): Promise<unifiedDataChannel.UnifiedData>// 将数据写入系统剪贴板+ setUnifiedData(data: unifiedDataChannel.UnifiedData): Promise<void>}

👉🏻 创建一个自定义类型的剪贴板内容对象。​​​​​​​

createData(mimeType: string, value: ValueType): PasteData// PasteData是剪切板内容对象,定义如下:class PasteData {+ getPrimaryText(): string // 获取首个条目的纯文本内容+ getPrimaryHtml(): string // 获取首个条目的html内容+ getPrimaryWant(): Want // 获取首个条目的Want对象内容。+ getPrimaryUri(): string // 获取首个条目的uri内容+ getPrimaryPixelMap(): image.PixelMap // 获取首个PixelMap// 向剪切板内容中添加一条记录+ addRecord(record: PasteDataRecord): void+ addRecord(mimeType: string, value: ValueType): void+ getMimeTypes(): Array<string> // 获取剪贴板中PasteDataProperty的mimeTypes列表+ getPrimaryMimeType(): string // 获取剪贴板内容中首个条目的数据类型。+ getProperty(): PasteDataProperty // 获取剪贴板内容的属性描述对象。+ setProperty(property: PasteDataProperty): void // 设置剪贴板内容的属性描述对象PasteDataProperty。+ getRecord(index: number): PasteDataRecord // 获取剪贴板内容中指定下标的条目。+ getRecordCount(): number // 获取剪贴板内容中条目的个数。+ getTag(): string // 获取剪贴板内容中用户自定义的标签内容+ hasType(mimeType: string): boolean // 检查剪贴板内容中是否有指定的MIME数据类型。+ removeRecord(index: number): void // 移除剪贴板内容中指定下标的条目。+ replaceRecord(index: number, record: PasteDataRecord): void // 替换剪贴板内容中指定下标的条目。+ pasteStart(): void // 读取剪贴板数据前,通知剪贴板服务保留跨设备通道。+ pasteComplete(): void // 通知剪贴板服务数据使用已完成。}

👉🏻 将数据写入系统剪贴板(使用Promise异步回调)

setData(data: PasteData): Promise<void>

👉🏻 读取系统剪贴板内容,使用callback异步回调。

getData( callback: AsyncCallback<PasteData>): void

注意:应用使用自定义控件后台访问剪贴板需要申请ohos.permission.READ_PASTEBOARD 权限。

👉🏻 获取剪贴板内容中条目的个数。

getRecordCount(): number

👉🏻 获取剪贴板内容中首个条目的数据类型。

getPrimaryMimeType(): string

👉🏻 获取首个条目的纯文本内容。

getPrimaryText(): string

3、示例

需要注意的是:在开发跨设备剪贴板的功能时,系统将自动完成跨设备的数据传递,我们只关心剪切板的写入和读取即可。

👉🏻 step 1: 本地设备写入剪切板​​​​​​​

import pasteboard from '@ohos.pasteboard';import { BusinessError } from '@ohos.base';export async function setPasteDataTest(): Promise<void> {  let text: string = 'hello world';  let pasteData: pasteboard.PasteData = pasteboard.createData(pasteboard.MIMETYPE_TEXT_PLAIN, text);  let systemPasteBoard: pasteboard.SystemPasteboard = pasteboard.getSystemPasteboard();  await systemPasteBoard.setData(pasteData).catch((err: BusinessError) => {    console.error(`Failed to set pastedata. Code: ${err.code}, message: ${err.message}`);  });}

👉🏻 step 2:协同设备读取剪切板内容​​​​​​​

import pasteboard from '@ohos.pasteboard';import { BusinessError } from '@ohos.base';export async function getPasteDataTest(): Promise<void> {  let systemPasteBoard: pasteboard.SystemPasteboard = pasteboard.getSystemPasteboard();  systemPasteBoard.getData((err: BusinessError, data: pasteboard.PasteData) => {    if (err) {      console.error(`Failed to get pastedata. Code: ${err.code}, message: ${err.message}`);      return;    }    // 对pastedata进行处理,获取类型,个数等    let recordCount: number = data.getRecordCount(); // 获取剪贴板内record的个数    let types: string = data.getPrimaryMimeType(); // 获取剪贴板内数据的类型    let primaryText: string = data.getPrimaryText(); // 获取剪贴板内数据的内容  });}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/448504.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2. MySQL数据库基础

一、数据库的操作 1. 显示当前的数据库 SHOW DATABASES;2. 创建数据库 语法&#xff1a; CREATE DATABASE [IF NOT EXISTS] db_name [create_specification...];//create_specification包括&#xff1a;[DEFAULT] CHARACTER SET charset_name[DEFAULT] COLLATE collation_n…

【题解】【记忆化递归】——Function

【题解】【记忆化递归】——Function Function题目描述输入格式输出格式输入输出样例输入 #1输出 #1 提示数据规模与约定 1.思路解析2.AC代码 Function 通往洛谷的传送门 题目描述 对于一个递归函数 w ( a , b , c ) w(a,b,c) w(a,b,c) 如果 a ≤ 0 a \le 0 a≤0 或 b ≤…

2025年广西高考报名流程图解(手机端)

广西 2025 年高考报名时间已经确定啦&#xff0c;从 2024 年 10 月 21 日开始&#xff0c;到 10 月 31 日 17:30 结束 &#x1f4bb;【报名路径】 有电脑端和手机端两种选择哦。 电脑端&#xff1a;登录 “广西招生考试院” 网站&#xff08;https://www.gxeea.cn&#xff0…

SQL数据库刷题sql_day34(移动平均值、累计求和)

描述 移动平均值 1.求不同产品 每个月以及截至当前月最近3个月的平均销售额 2.求不同产品截至当前月份的累计销售额 数据准备 mysql CREATE TABLE sales_monthly (product VARCHAR(20),ym VARCHAR(10),amount DECIMAL(10,2) );-- 插入测试数据 INSERT INTO sales_monthly (prod…

厨房老鼠数据集:掀起餐饮卫生监测的科技浪潮

厨房老鼠数据集&#xff1a;掀起餐饮卫生监测的科技浪潮 摘要&#xff1a;本文深入探讨了厨房老鼠数据集在餐饮行业卫生管理中的重要性及其相关技术应用。厨房老鼠数据集通过收集夜间厨房图像、老鼠标注信息以及环境数据&#xff0c;为深度学习模型提供了丰富的训练样本。基于…

目前我国网络安全人才市场状况

网络安全人才市场状况 本章以智联招聘多年来形成的丰富的招聘、求职信息大数据为基础&#xff0c;结合了奇安信集团 在网络安全领域多年来的专业研究经验&#xff0c;相关研究成果具有很强的代表性。对涉及安全人才 的全平台招聘需求与求职简历进行分析&#xff08;注&#xf…

Ajax(web笔记)

文章目录 1.Ajax的概念2.Ajax 的作用3.原生Ajax4.Axios4.1Axios的概念4.2Axios入门 1.Ajax的概念 AsynchronousJavaScriptAndXML&#xff0c;异步的JavaScript和XML 2.Ajax 的作用 数据交换:过Ajax可以给服务器发送请求&#xff0c;并获取服务器响应的数据。异步交互:可以在…

小猿口算辅助工具(nodejs版)

github 地址&#xff1a;https://github.com/pbstar/xyks-helper 实现原理 通过屏幕截图截取到题目区域的两个数字&#xff0c;然后通过 ocr 识别出数字&#xff0c;最后通过计算得出答案&#xff0c;并通过模拟鼠标绘制答案。 依赖插件 node-screenshots&#xff1a;屏幕截…

ai搜索工具免费的有那些?这几年搜索都发生了哪些变化?

前言这几年大家的搜索都发生了哪些变化&#xff1f; 要说疯狂的就属于AI工具了&#xff0c;以前搜索内容有广告自己只能眼巴巴的看着&#xff0c;现在不少人的搜索行为都有所变化&#xff0c;经过自己测试也给大家推荐一些自己使用的AI搜索工具毕竟免费。AI对传统搜索影响在传…

linux 虚拟环境下源码安装DeepSpeed

第一步&#xff1a;创建虚拟环境&#xff1a; conda create -n deepspeed python3.10 第二步&#xff1a;进入虚拟环境&#xff0c;安装Pytorch 2.3.1 # CUDA 12.1 conda install pytorch2.3.1 torchvision0.18.1 torchaudio2.3.1 pytorch-cuda12.1 -c pytorch -c nvidia 第…

测试教程分享

前几年在腾讯课堂上发布了不少课程&#xff0c;后来腾讯课堂改革&#xff0c;要收会员费&#xff0c;课程还要抽提程&#xff0c;这么下来就相当于白干了。就放弃了在上面发课程&#xff0c;再后来腾讯课堂就关闭了&#xff0c;以前发布的视频就没有地方发了&#xff0c;于是我…

Android MQTT调试助手开发

在Android开发中&#xff0c;与远程服务器进行通信是一个常见的需求。MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的、基于发布/订阅模式的消息传输协议&#xff0c;广泛应用于物联网&#xff08;IoT&#xff09;场景中。在阿里云物联网平台…

张雪峰谈网络安全专业前景广阔,现状惨不忍睹

张雪峰在谈论网络安全专业时&#xff0c;主要强调了该专业的就业前景、适应岗位、以及部分高校在此领域的优势。以下是他的观点归纳&#xff1a; 张雪峰对网络安全专业的观点 就业前景广阔 网络空间安全专业的就业前景非常广阔。随着信息时代的到来&#xff0c;各类企业和组织…

Q2=17.8和w=0.6198情况

&#xff08;个人学习笔记&#xff0c;仅供参考&#xff09; import numpy as np from scipy.special import kv, erfc from scipy.integrate import dblquad import matplotlib.pyplot as plt import scipy.integrate as spiw 0.6198 g0_sq 21.5989 rho 0.782908 Q2 17.8…

KubeSphere v4 安装指南

日前&#xff0c;KubeSphere v4 发布&#xff0c;相较于之前的版本&#xff0c;新版本在架构上有了颠覆性的变化。为了让社区的各位小伙伴能够丝滑的从旧版本过渡到新版本&#xff0c;我们特别推出本篇安装指南文章&#xff0c;以供参考。 关于 KubeSphere v4 的介绍&#xff…

一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景

文章目录 一、常用数据库概览1.1 关系型数据库1.2 非关系型数据库1.2.1 KV数据库1.2.2 文档型数据库1.2.3 列式存储数据库1.2.4 图数据库 1.3 SQL与NoSQL区别1.3.1 结构化与非结构化1.3.2 关联和非关联1.3.3 查询方式1.3.4 事务1.3.5 总结 二、MySQL三、PostgreSQL3.1 特点、适…

基本计算器 II

文章目录 题目解析解题小结 题目解析 给你一个字符串表达式 s &#xff0c;请你实现一个基本计算器来计算并返回它的值。 整数除法仅保留整数部分。 你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。 注意&#xff1a;不允许使用任何将字符…

应急实战(10):Linux后门帐号

目录 1. Prepare 1.1 部署安全设备 2. Detect 2.1 设备产生告警 3. Contain 4. Eradicate 4.1 删除后门帐号 4.2 加固弱口令帐号 5. Recover 5.1 恢复帐号登录 6. Follow-Up 6.1 修改登录端口 6.2 开启命令记录 1. Prepare 1.1 部署安全设备 部署主机安全产品&#xff1a;牧云H…

Openlayer实现矢量图层点击高亮

概述 本文主要介绍如何在 Openlayers 矢量图层上实现点击高亮效果。 效果演示 具体实现 数据准备 矢量数据可点击下载 加载矢量图层 矢量数据是通过调用Openlayers的new GeoJSON()实例去加载读取。 let style = new Style({fill: new Fill({color: "rgba(255, 255,…

SldWorks问题 2. 矩阵相关接口使用上的失误

问题 在计算三维点在图纸&#xff08;DrawingDoc&#xff09;中的位置时&#xff0c;就是算不对&#xff0c;明明就4、5行代码&#xff0c;怎么看都是很“哇塞”的&#xff0c;毫无问题的。 但结果就是不对。 那就调试一下吧&#xff0c;调试后发现生成的矩阵很不对劲&#…