HarmonyOS 鸿蒙Next 剪切板systemPasteboard.getData接口获取不到数据
HarmonyOS 鸿蒙Next 剪切板systemPasteboard.getData接口获取不到数据
升级版本后发现systemPasteboard.getData接口获取不到数据;在旧版本上没有问题。也加上ohos.permission.READ_PASTEBOARD权限了。
涉及接口变更,需要弹窗授权,可参考文档:链接
详情参考以下代码
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的使用方式有关。以下是一些可能的原因及解决方法概述:
-
权限检查:确保应用已正确申请并获得了访问剪切板的权限。在HarmonyOS中,这通常涉及在
config.json
文件中声明相关权限。 -
数据格式:验证剪切板中的数据格式是否与
getData
接口请求的格式一致。如果剪切板中的数据是以不同格式存储的(例如文本与图片),则使用不匹配的格式调用getData
将无法获取数据。 -
API使用:检查
systemPasteboard.getData
的调用方式是否正确。确保传递的参数(如数据类型标识符)准确无误。 -
系统限制:了解是否存在系统级的限制或已知问题,导致特定情况下无法访问剪切板数据。
-
调试与日志:增加日志记录,检查
getData
调用前后的系统日志,以获取更多关于为何无法获取数据的线索。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html,