HarmonyOS 鸿蒙Next 剪切板systemPasteboard.getData接口获取不到数据

发布于 1周前 作者 zlyuanteng 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 剪切板systemPasteboard.getData接口获取不到数据

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

2 回复

涉及接口变更,需要弹窗授权,可参考文档:链接

详情参考以下代码
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 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%')
  }
}

更多关于HarmonyOS 鸿蒙Next 剪切板systemPasteboard.getData接口获取不到数据的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对HarmonyOS 鸿蒙Next系统中systemPasteboard.getData接口获取不到数据的问题,这通常与剪切板权限管理、数据格式不匹配或系统API的使用方式有关。以下是一些可能的原因及解决方法概述:

  1. 权限检查:确保应用已正确申请并获得了访问剪切板的权限。在HarmonyOS中,这通常涉及在config.json文件中声明相关权限。

  2. 数据格式:验证剪切板中的数据格式是否与getData接口请求的格式一致。如果剪切板中的数据是以不同格式存储的(例如文本与图片),则使用不匹配的格式调用getData将无法获取数据。

  3. API使用:检查systemPasteboard.getData的调用方式是否正确。确保传递的参数(如数据类型标识符)准确无误。

  4. 系统限制:了解是否存在系统级的限制或已知问题,导致特定情况下无法访问剪切板数据。

  5. 调试与日志:增加日志记录,检查getData调用前后的系统日志,以获取更多关于为何无法获取数据的线索。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部