【HarmonyOS】应用实现读取剪切板内容(安全控件和自读取)

【HarmonyOS】应用实现读取粘贴板内容(安全控件和自读取)

前言

在这里插入图片描述

三方应用 读取系统剪切板是比较常见的功能。可以实现功能入口的快捷激活跳转,以及用户粘贴操作的简化,增强用户的体验感。

但是在用户日渐注重隐私的今天,系统对于剪切板权限的开放也在收紧。

在鸿蒙中实现剪切板很简单,目前有两种方式,分别为:1.使用粘贴安全控件 2.申请用户授权,应用自己读取

解决方案

1.使用粘贴安全控件
鸿蒙系统提供了PasteButton安全组件,通过该按钮组件,用户点击即认为授权,不需要三方应用再自己申请权限。通过点击后的回调,再通过剪切板读取其中的内容pasteboard.getSystemPasteboard().getData。需要注意的时候,该按钮点击授权为临时授权,再app关闭,切到后台后授权就没有了,需要用户重新点击按钮。

所以一般该操作的设计都是,点击按钮后马上去读取剪切板内容,减少逻辑读取的链路。目前看读取虽然是异步,但是读取速度还是很快,影响不大

        PasteButton()
          .padding({top: 12, bottom: 12, left: 24, right: 24})
          .onClick((event: ClickEvent, result: PasteButtonOnClickResult) => {
            console.log(this.TAG, " PasteboardPage PasteButton result: " + JSON.stringify(result) + " event: " + JSON.stringify(event));
            if (PasteButtonOnClickResult.SUCCESS === result) {
              pasteboard.getSystemPasteboard().getData((err: BusinessError, pasteData: pasteboard.PasteData) => {
                console.log(this.TAG, " PasteboardPage getData err: " + JSON.stringify(err) + " pasteData: " + JSON.stringify(pasteData));
                if (err) {
                  return;
                }
                this.message = pasteData.getPrimaryText();
              });
            }
          })

----按钮样式需要显著,并且没有故意遮挡,透明度,UI叠加,误导用户等因素会导致按钮回调授权失败。原则是让用户能清晰感知此按钮是粘贴按钮。

2.申请用户授权,应用自读取
需要申请"ohos.permission.READ_PASTEBOARD"权限。该权限是管制权限,需要你的应用去通过场景申请,比如你有口令的场景,就可以申请该权限。【申请使用受限权限】
在这里插入图片描述
------如果应用涉及获取受限权限,在应用发布上架时,应用市场(AGC)将根据应用的使用场景审核是否可以使用对应的受限权限。如不符合,应用的上架申请将被驳回,审核方式请见发布HarmonyOS应用。

当你申请了该权限后,就不需要安全控件,直接通过系统剪切板可以读取到其中的内容。
需要注意的是,申请的是对应场景,比如口令场景。但是系统并不会对你读取的内容做出过滤,你能读取到用户复制的所有内容,并不只是口令。

DEMO示例:

PasteboardPage.ets

import { hilog } from '@kit.PerformanceAnalysisKit';
import { abilityAccessCtrl, bundleManager, common } from '@kit.AbilityKit';
import { pasteboard, BusinessError } from '@kit.BasicServicesKit';

/**
 * 剪切板
 */


struct PasteboardPage {

  private TAG: string = "PasteboardPage";

   message: string = '';

  private requestPermissions(context: common.Context): void {
    // 进入页面时,向用户请求授权广告跨应用关联访问权限
    const atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    try {
      atManager.requestPermissionsFromUser(context, ["ohos.permission.READ_PASTEBOARD"]).then((data) => {
        if (data.authResults[0] === 0) {
          this.readPasteBoardData();
        } else {
          hilog.error(0x0000, 'testTag', '%{public}s', 'user rejected');
        }
      }).catch((err: BusinessError) => {
        hilog.error(0x0000, 'testTag', '%{public}s', `request permission failed, error: ${err.code} ${err.message}`);
      })
    } catch (err) {
      hilog.error(0x0000, 'testTag', '%{public}s', `catch err->${err.code}, ${err.message}`);
    }
  }


  onClickReadPasteboard = ()=>{
    this.requestPermissions(getContext());
  }

  private readPasteBoardData(){
    let systemPasteboard: pasteboard.SystemPasteboard = pasteboard.getSystemPasteboard();
    systemPasteboard.getData((err: BusinessError, pasteData: pasteboard.PasteData) => {
      if (err) {
        console.error('Failed to get PasteData. Cause: ' + err.message);
        return;
      }
      let text: string = pasteData.getPrimaryText();
      this.message = text;
    });
  }


  build() {
    Column({ space: 10 }) {
      Text("点击启用授权读取剪切板")
        .onClick(this.onClickReadPasteboard)

        TextInput({ placeholder: '请输入验证码', text: this.message })
          .onChange((value: string, previewText?: PreviewText)=>{
            console.log(this.TAG, " TextInput onChange value: " + JSON.stringify(value) + " previewText: " + JSON.stringify(previewText));
            this.message = value;
          })
        PasteButton()
          .padding({top: 12, bottom: 12, left: 24, right: 24})
          .onClick((event: ClickEvent, result: PasteButtonOnClickResult) => {
            console.log(this.TAG, " PasteboardPage PasteButton result: " + JSON.stringify(result) + " event: " + JSON.stringify(event));
            if (PasteButtonOnClickResult.SUCCESS === result) {
              pasteboard.getSystemPasteboard().getData((err: BusinessError, pasteData: pasteboard.PasteData) => {
                console.log(this.TAG, " PasteboardPage getData err: " + JSON.stringify(err) + " pasteData: " + JSON.stringify(pasteData));
                if (err) {
                  return;
                }
                this.message = pasteData.getPrimaryText();
              });
            }
          })
    }
    .justifyContent(FlexAlign.Center)
    .width('100%')
    .height('100%')
  }
}

module.json5

  "requestPermissions": [
  
      {
        "name": "ohos.permission.READ_PASTEBOARD",
        "usedScene": {
          "abilities": [
            "FormAbility"
          ],
          "when": "inuse"
        },
        "reason": "$string:module_desc",
      },

    ]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

飞牛云fnOS本地部署WordPress个人网站并一键发布公网远程访问

文章目录 前言1. Docker下载源设置2. Docker下载WordPress3. Docker部署Mysql数据库4. WordPress 参数设置5. 飞牛云安装Cpolar工具6. 固定Cpolar公网地址7. 修改WordPress配置文件8. 公网域名访问WordPress 前言 本文旨在详细介绍如何在飞牛云NAS上利用Docker部署WordPress&a…

解析安卓镜像包和提取DTB文件的操作日志

概述 想查看一下安卓的镜像包里都存了什么内容 步骤 使用RKDevTool_v3.15对RK3528_DC_HK1_RBOX_K8_Multi_WIFI_13_20230915.2153.img解包 路径: 高级(Advancing) > 固件(firmware) > 解包(unpacking)得到\Output\Android\Image boot.imguboot.imgsuper.img 处理boot.…

LeetCode 热题100(八)【二叉树】(3)

目录 8.11二叉树展开为链表(中等) 8.12从前序与中序遍历序列构造二叉树(中等) 8.13路径总和III(中等) 8.14二叉树的最近公共祖先(中等) 8.15二叉树中的最大路径和(困…

FPGA实现PCIE3.0视频采集转SDI输出,基于XDMA+GS2971架构,提供工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案本博已有的 SDI 编解码方案本博客方案的PCIE2.0版本 3、PCIE基础知识扫描4、工程详细设计方案工程设计原理框图电脑端视频QT上位机XDMA配置及使用XDMA中断模块FDMA图像缓存Native视频时序生成RGB转BT1120SDI转HDM…

纽约大学:指导LLM提出澄清性问题

📖标题:Modeling Future Conversation Turns to Teach LLMs to Ask Clarifying Questions 🌐来源:arXiv, 2410.13788 🌟摘要 🔸大型语言模型(LLM)必须经常对高度模糊的用户请求做出…

STM32F1学习——I2C通信

一、I2C通信一带多 在学习通信的时候,我们常会听到串口通信。但串口通信只限定两个设备之间,如果有多个设备,通信的两个设备就要连接上,接线复杂。所以有了总线式通信,在一条总线上可以连接多个设备,这些根…

当你想要conda安装遇到UnavailableInvalidChannel: HTTP 404 NOT FOUND for channel的问题

想要装个虚拟环境,结果遇到404。 看了第一个GitHub帖子中的一句话 UnavailableInvalidChannel: The channel is not accessible or is invalid. Navigator not launching. Issue #9473 conda/conda GitHub 想说那我就把这个not found的channel删掉吧&#xff…

Jmeter中的前置处理器(一)

前置处理器 1--JSR223 PreProcessor 功能特点 自定义数据处理:使用脚本语言处理请求数据,实现高度定制化的数据处理和生成。动态数据生成:在请求发送前生成动态数据,如随机数、时间戳等。变量设置:设置和修改 JMeter…

2023年高校大数据挑战赛A题中文文本纠错求解全过程文档及程序

2023年高校大数据挑战赛 A题 中文文本纠错 原题再现: 中文文本纠错的任务主要是针对中文文本中出现的错误进行检测和纠正,属于人工智能自然语言处理的研究子方向。中文文本纠错通常使用的场景有政务公文、裁判文书、新闻出版等,中文文本纠错…

使用CNN进行验证码识别:深度学习与图像预处理教程

验证码(CAPTCHA)广泛用于区分人类和自动化程序(如机器人),通常由扭曲的字母、数字或符号组成。为了实现验证码的自动识别,深度学习尤其是卷积神经网络(CNN)非常有效。本文将带你一起…

基于 Python Django 的二手房间可视化系统分析

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

探索 Sentinel 服务容错

Sentinel 是阿里巴巴开源的一款高可用防护组件,主要用于分布式系统中的流量控制、熔断降级和系统负载保护。它在 Java 微服务架构中扮演着重要的角色,帮助开发者确保系统的稳定性和可靠性。 以下是 Sentinel 的一些关键特性: 流量控制(Flow Control):通过对请求进行限流…

DBeaver 连接 OceanBase Oracle 租户

DBeaver 是一款通用的数据库工具软件,支持任何具有JDBC驱动程序的数据库。DBeaver 需要 Java 运行环境的支持。截稿时 DBeaver 24.0.0 版本默认提供的 OceanBase 驱动是连接 MySQL 的,想连接 Oracle 租户需要新建一个驱动器使用。 下载数据库驱动包 1、…

Dubbo 3.x源码(24)—Dubbo服务引用源码(7)接口级服务发现订阅refreshInterfaceInvoker

基于Dubbo 3.1,详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了Dubbo3.1版本的MigrationRuleHandler这个处理器,它用于通过动态更改规则来控制迁移行为。MigrationRuleListener的onrefer方法是Dubbo2.x 接口级服务发现与Dubbo3.x应用级服务发现…

企业如何提高招聘能力?

企业如何提高招聘能力? 许多企业在进行招聘工作时,常常会遇到各种问题和挑战。尽管付出了大量的时间和精力,但结果却并不总是如人意。例如,企业可能会经历一次又一次的面试,却仍然找不到一个能够适应岗位要求的合适人…

JAVA:探索 EasyExcel 的技术指南

1、简述 在 Java 开发中,Excel 文件的读写操作是一项常见的需求。阿里巴巴开源的 EasyExcel 提供了一种高效、简洁的解决方案,特别是在处理大规模数据时表现尤为突出。本文将详细介绍 EasyExcel 的优缺点、应用场景,并通过实例展示其基本用法…

AI制作ppt

1,kimi: 实际上也是AiPPT.cn这个网站(但是有实际次数限制) 2,其余专业AI ppt生成网站: (1)gamma:https://gamma.app/ 大概能制作7~10页左右 free的ppt,其余要…

穿越数据迷宫:C++哈希表的奇幻旅程

文章目录 前言📔一、unordered系列关联式容器📕1.1 unordered 容器概述📕1.2 哈希表在 unordered 容器中的实现原理📕1.3 unordered 容器的特点 📔二、unordered_set 和 unordered_map 的基本操作📕2.1 un…

数据结构 -二叉搜索树

一.什么是二叉搜索树 树插入删除方便比线性数组 二.二叉搜索树的查找操作 尾递归可以用循环递归 三.二叉树的插入操作 35要挂在33上面必须记住33的位置 解决方法,要求递归函数返回一个 结点插到33的右子树 四.二叉搜索树的删除 要是删除的是叶子节点之间删除 只有一…

计算机三级 数据库技术

第一章 数据库应用系统开发方法 1.1 数据库应用系统生命周期 软件工程:软件工程的思想,即用工程的概念、原理、技术和方法对软件生产、开发的全过程进行跟踪和管理 软件开发方法:瀑布模型、快速原型模型、螺旋模型 DBAS生命周期模型 1.2 规划与分析 系统规划与定…