HarmonyOS 鸿蒙Next中报错闪退
HarmonyOS 鸿蒙Next中报错闪退 使用这个的时候直接就报错闪退了,
Module name:com.citictrust.hm
Version:1.0.0
VersionCode:1000000
PreInstalled:No
Foreground:Yes
Pid:46249
Uid:20020195
Reason:Error
Error name:Error
Error message:Parameter Error. The type of “permissionList” must be Array<string>.
Error code:
Stacktrace:
Cannot get SourceMap info, dump raw stack:
at anonymous (entry|entry|1.0.0|src/main/ets/views/ProductDetailPage.ts:5706:31)
但是如果把类型从let permissionList: Array<Permissions> = [];改为let permissionList: Array<string> = [];, 又报错Argument of type ‘string[]’ is not assignable to parameter of type ‘Permissions[]’. Type ‘string’ is not assignable to type ‘Permissions’. <ArkTSCheck> 这种情况怎么解决
我使用的是DevEco Studio 6.0.0 Release, 构建版本:6.0.0.858,
import { abilityAccessCtrl, bundleManager, common, PermissionRequestResult, Permissions, Want } from '@kit.AbilityKit';
Web({
src: this.params.src,
controller: this.webviewController
}).onPermissionRequest((event) => {
if (event) {
console.log('permission request====', JSON.stringify(event))
let permissionList: Array<Permissions> = [];
// let permissionList: Array<'ohos.permission.CAMERA' | 'ohos.permission.MICROPHONE'> = []
event.request.getAccessibleResource().forEach((it) => {
if (it.toString() === 'TYPE_VIDEO_CAPTURE') {
permissionList.push('ohos.permission.CAMERA')
permissionList.push('ohos.permission.MICROPHONE')
} else if (it.toString() === 'TYPE_AUDIO_CAPTURE') {
permissionList.push('ohos.permission.MICROPHONE')
}
})
let atManager = abilityAccessCtrl.createAtManager();
atManager.requestPermissionsFromUser(getContext(this), permissionList)
.then((data) => {
console.info('data permissions:' + data.permissions);
console.info('data authResults:' + data.authResults);
event.request.grant(event.request.getAccessibleResource());
}).catch((error: BusinessError) => {
console.error(`Failed to request permissions from user. Code is ${error.code}, message is ${error.message}`);
})
}
})
更多关于HarmonyOS 鸿蒙Next中报错闪退的实战教程也可以访问 https://www.itying.com/category-93-b0.html
根据你提供的错误信息和代码,问题核心在于 requestPermissionsFromUser 方法的参数类型不匹配。
问题分析:
-
首次错误:
The type of "permissionList" must be Array<string>.- 这表明
requestPermissionsFromUser方法期望接收一个字符串数组(Array<string>),但你传入的是Array<Permissions>。Permissions是一个联合类型(例如'ohos.permission.CAMERA' | 'ohos.permission.MICROPHONE'),在编译时被识别为与string不同的类型。
- 这表明
-
修改后错误:
Argument of type 'string[]' is not assignable to parameter of type 'Permissions[]'.- 当你将
permissionList类型改为Array<string>后,TypeScript(ArkTS)的类型检查(ArkTSCheck)发现,方法签名期望的是更具体的Permissions[]类型,而非宽泛的string[]。这是为了确保类型安全,防止传入无效的权限字符串。
- 当你将
解决方案:
你需要明确地将 permissionList 声明为 Permissions 类型的数组,并确保其值符合 Permissions 联合类型的定义。根据你代码中的逻辑,权限值已经是合法的('ohos.permission.CAMERA' 和 'ohos.permission.MICROPHONE'),因此只需修正类型声明。
正确代码示例:
将 permissionList 的声明行修改如下:
let permissionList: Permissions[] = []; // 使用 Permissions[] 而非 Array<Permissions>
或者,为了更清晰地匹配你导入的类型,可以保持原样但确保类型推导正确。实际上,问题可能源于类型推断的细微差别。最直接且符合API定义的方式是:
import { Permissions } from '@kit.AbilityKit'; // 确保已导入
// ... 在 onPermissionRequest 回调内 ...
let permissionList: Permissions[] = []; // 关键修正
event.request.getAccessibleResource().forEach((it) => {
if (it.toString() === 'TYPE_VIDEO_CAPTURE') {
permissionList.push('ohos.permission.CAMERA' as Permissions); // 可选的类型断言,确保推演正确
permissionList.push('ohos.permission.MICROPHONE' as Permissions);
} else if (it.toString() === 'TYPE_AUDIO_CAPTURE') {
permissionList.push('ohos.permission.MICROPHONE' as Permissions);
}
});
解释:
Permissions[]是Array<Permissions>的语法糖,两者等价,但使用Permissions[]更常见且直接。- 通过将数组声明为
Permissions[],你明确了其元素必须是Permissions联合类型中定义的字符串字面量之一。 - 在
push操作时,由于你推入的值(如'ohos.permission.CAMERA')本身就是Permissions类型的合法值,类型检查应该通过。如果IDE仍有警告,可以使用as Permissions进行类型断言(如上示例),明确告知编译器该字符串是Permissions类型。
这样修改后,既满足了 requestPermissionsFromUser 对 Array<string> 的运行时要求(因为 Permissions 本质是字符串的联合类型),又通过了编译时对 Permissions[] 的严格类型检查,从而解决闪退问题。


