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

打印 上一主题 下一主题

主题 947|帖子 947|积分 2841

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

前言


三方应用 读取系统剪切板是比力常见的功能。可以实现功能入口的快捷激活跳转,以及用户粘贴操作的简化,增强用户的体验感。
但是在用户日渐注意隐私的今天,系统对于剪切板权限的开放也在收紧。
在鸿蒙中实现剪切板很简单,目前有两种方式,分别为:1.利用粘贴安全控件 2.申请用户授权,应用自己读取
办理方案

1.利用粘贴安全控件
鸿蒙系统提供了PasteButton安全组件,通过该按钮组件,用户点击即以为授权,不须要三方应用再自己申请权限。通过点击后的回调,再通过剪切板读取其中的内容pasteboard.getSystemPasteboard().getData。须要注意的时间,该按钮点击授权为临时授权,再app关闭,切到背景后授权就没有了,须要用户重新点击按钮。
所以一样平常该操作的设计都是,点击按钮后立刻去读取剪切板内容,镌汰逻辑读取的链路。目前看读取虽然是异步,但是读取速度还是很快,影响不大
  1.         PasteButton()
  2.           .padding({top: 12, bottom: 12, left: 24, right: 24})
  3.           .onClick((event: ClickEvent, result: PasteButtonOnClickResult) => {
  4.             console.log(this.TAG, " PasteboardPage PasteButton result: " + JSON.stringify(result) + " event: " + JSON.stringify(event));
  5.             if (PasteButtonOnClickResult.SUCCESS === result) {
  6.               pasteboard.getSystemPasteboard().getData((err: BusinessError, pasteData: pasteboard.PasteData) => {
  7.                 console.log(this.TAG, " PasteboardPage getData err: " + JSON.stringify(err) + " pasteData: " + JSON.stringify(pasteData));
  8.                 if (err) {
  9.                   return;
  10.                 }
  11.                 this.message = pasteData.getPrimaryText();
  12.               });
  13.             }
  14.           })
复制代码
----按钮样式须要显著,并且没有故意遮挡,透明度,UI叠加,误导用户等因素会导致按钮回调授权失败。原则是让用户能清楚感知此按钮是粘贴按钮。
2.申请用户授权,应用自读取
须要申请"ohos.permission.READ_PASTEBOARD"权限。该权限是管制权限,须要你的应用去通过场景申请,比如你有口令的场景,就可以申请该权限。【申请利用受限权限】

------如果应用涉及获取受限权限,在应用发布上架时,应用市场(AGC)将根据应用的利用场景审核是否可以利用对应的受限权限。如不符合,应用的上架申请将被驳回,审核方式请见发布HarmonyOS应用。
当你申请了该权限后,就不须要安全控件,直接通过系统剪切板可以读取到其中的内容。
须要注意的是,申请的是对应场景,比如口令场景。但是系统并不会对你读取的内容做出过滤,你能读取到用户复制的所有内容,并不只是口令。
DEMO示例:

PasteboardPage.ets
  1. import { hilog } from '@kit.PerformanceAnalysisKit';import { abilityAccessCtrl, bundleManager, common } from '@kit.AbilityKit';import { pasteboard, BusinessError } from '@kit.BasicServicesKit';/** * 剪切板 */@Entry@Componentstruct 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()
  2.           .padding({top: 12, bottom: 12, left: 24, right: 24})
  3.           .onClick((event: ClickEvent, result: PasteButtonOnClickResult) => {
  4.             console.log(this.TAG, " PasteboardPage PasteButton result: " + JSON.stringify(result) + " event: " + JSON.stringify(event));
  5.             if (PasteButtonOnClickResult.SUCCESS === result) {
  6.               pasteboard.getSystemPasteboard().getData((err: BusinessError, pasteData: pasteboard.PasteData) => {
  7.                 console.log(this.TAG, " PasteboardPage getData err: " + JSON.stringify(err) + " pasteData: " + JSON.stringify(pasteData));
  8.                 if (err) {
  9.                   return;
  10.                 }
  11.                 this.message = pasteData.getPrimaryText();
  12.               });
  13.             }
  14.           })
  15.     }    .justifyContent(FlexAlign.Center)    .width('100%')    .height('100%')  }}
复制代码
module.json5
  1.   "requestPermissions": [
  2.   
  3.       {
  4.         "name": "ohos.permission.READ_PASTEBOARD",
  5.         "usedScene": {
  6.           "abilities": [
  7.             "FormAbility"
  8.           ],
  9.           "when": "inuse"
  10.         },
  11.         "reason": "$string:module_desc",
  12.       },
  13.     ]
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

前进之路

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表