HarmonyOS 剪切板systemPasteboard.getData接口获取不到数据?

升级版本后发现systemPasteboard.getData接口获取不到数据;在旧版本上没有问题。也加上ohos.permission.READ\_PASTEBOARD权限了。

阅读 720
2 个回答

涉及接口变更,需要弹窗授权,详情参考:https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-basic-services-kit/js-apis-pasteboard.md\#getdata9

参考以下代码

import hilog from '@ohos.hilog';
import { BusinessError } from '@ohos.base';
import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl';
import common from '@ohos.app.ability.common';
import bundleManager from '@ohos.bundle.bundleManager';
import pasteboard from '@ohos.pasteboard';


async function checkAccessToken(permission: Permissions): Promise<abilityAccessCtrl.GrantStatus> {
  let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
  let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;

  // 获取应用程序的accessTokenID
  let tokenId: number = 0;
  try {
    let bundleInfo: bundleManager.BundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
    let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
    tokenId = appInfo.accessTokenId;
  } catch (error) {
    let err: BusinessError = error as BusinessError;
    console.error(`Failed to get bundle info for self. Code is ${err.code}, message is ${err.message}`);
  }

  // 校验应用是否被授予权限
  try {
    grantStatus = await atManager.checkAccessToken(tokenId, permission);
  } catch (error) {
    let err: BusinessError = error as BusinessError;
    console.error(`Failed to check access token. Code is ${err.code}, message is ${err.message}`);
  }

  return grantStatus;
}

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';
  @State msgList: Array<string> = [];
  // @State oaid: string = '';
  @State permission_state: boolean = true;

  reqPermissionsFromUser(permissions: Array<Permissions>): void {
    let context = getContext(this) as common.UIAbilityContext;
    let atManager = abilityAccessCtrl.createAtManager();
    // requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
    atManager.requestPermissionsFromUser(context, permissions).then((data) => {
    let grantStatus: Array<number> = data.authResults;
    let length: number = grantStatus.length;
    for (let i = 0; i < length; i++) {
    if (grantStatus[i] === 0) {
    // 用户授权,可以继续访问目标操作
    this.permission_state = true;
    this.msgList.push('申请权限成功');
  }
  else {
    // 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限
    // openPermissionsInSystemSettings();
    console.error("user did not grant!")
    this.permission_state = false;
    this.msgList.push('申请权限失败');
  }
}
// 授权成功
}).catch((err: String) => {
})
}

async getPaste() {
  const permissions: Array<Permissions> = ['ohos.permission.READ_PASTEBOARD'];
  let grantStatus1: abilityAccessCtrl.GrantStatus = await checkAccessToken(permissions[0]);

  if (grantStatus1 === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
    try {
      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.msgList.push('剪贴板内容:'+text);
      });
    } catch (err) {
      hilog.error(0x0000, 'testTag', '%{public}s', `get oaid by promise catch error: ${err.code} ${err.message}`);
    }
  } else {
    // 申请权限
    if(this.permission_state) {
      this.reqPermissionsFromUser(permissions)
    }else{

    }
  }
}

build() {
  Column() {
    Button({ type: ButtonType.Normal, stateEffect: true }) {
      Text('读取剪贴板内容')
        .fontColor(Color.White)
        .fontSize(20)
    }
    .borderRadius(8)
      .width('45%')
      .height('5%')
      .backgroundColor(0x317aff)
      .onClick(() => {
        this.getPaste()
        try {
          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.msgList.push('剪贴板内容:'+text);
          });
        } catch (err) {
          hilog.error(0x0000, 'testTag', '%{public}s', `get oaid by promise catch error: ${err.code} ${err.message}`);
        }
      })
    ForEach(this.msgList, (item: string) => {
      Text(item)
        .fontSize(25)
        .textOverflow({ overflow: TextOverflow.Clip })
        .maxLines(10)
        .width('80%')
        .margin({ top: 5 })
    })
  }
  .width('100%')
    .height('100%')
}
}

1.确认权限声明正确:
确保在config.json文件中正确声明了ohos.permission.READ_PASTEBOARD权限。这通常看起来像这样:
json
"requiredPermissions": [

{  
    "name": "ohos.permission.READ_PASTEBOARD"  
}  

]
2.动态请求权限:
从HarmonyOS 3开始,即使你在config.json中声明了权限,也需要在应用运行时动态请求这些权限(如果系统要求)。检查你的应用是否在运行时请求了READ_PASTEBOARD权限,并且用户已经授予了这个权限。
3.检查API变化:
查看HarmonyOS的新版本是否对systemPasteboard.getData接口进行了更改或弃用。有时候,系统更新会改变API的行为或引入新的API。访问华为开发者网站或查阅最新的API文档来获取这方面的信息。
4.检查应用状态:
确保应用处于可以访问剪贴板的状态。有些情况下,应用可能因为某些原因(如后台限制、省电模式等)而无法访问剪贴板。
5.代码审查:
检查调用systemPasteboard.getData的代码是否有误。确保你正确地处理了异步回调和错误处理。
6.调试和日志:
使用HarmonyOS提供的开发者工具和调试功能来检查应用的日志输出。这可能会给出为什么无法获取剪贴板数据的线索。
7.测试其他应用:
尝试在相同的设备上运行其他应用,看看它们是否能成功访问剪贴板。这有助于确定问题是否特定于你的应用或设备。
8.联系华为支持:
如果以上步骤都不能解决问题,你可能需要联系华为的技术支持团队来获取帮助。
9.考虑使用替代方案:
如果systemPasteboard.getData接口在新版本中存在问题,并且你无法找到解决方案,你可能需要考虑使用其他方法来实现相同的功能,比如使用全局事件或与其他应用进行通信来间接获取剪贴板数据。
10.查看社区和论坛:
访问HarmonyOS的开发者社区和论坛,看看是否有其他开发者遇到了类似的问题,并找到了解决方案。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进