0


【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';/**
 * 剪切板
 */@Entry@Component
struct PasteboardPage {

  private TAG: string ="PasteboardPage";@State 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",},]
标签: harmonyos 安全 华为

本文转载自: https://blog.csdn.net/u010949451/article/details/143775633
版权归原作者 GeorgeGcs 所有, 如有侵权,请联系我们删除。

“【HarmonyOS】应用实现读取剪切板内容(安全控件和自读取)”的评论:

还没有评论