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

2 回复

鸿蒙Next应用闪退通常由以下原因导致:

  1. 权限配置问题:未在module.json5中正确声明所需权限。
  2. 资源引用错误:如调用不存在的资源ID或类型不匹配。
  3. API使用不当:使用了当前SDK版本不支持的API或调用方式错误。
  4. 内存访问异常:如空指针或越界访问。
  5. ArkTS/ArkUI语法错误:如状态变量更新不符合规范。

可通过DevEco Studio的日志查看器(Log)或HiLog工具捕获崩溃日志,定位具体错误堆栈。

更多关于HarmonyOS 鸿蒙Next中报错闪退的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


根据你提供的错误信息和代码,问题核心在于 requestPermissionsFromUser 方法的参数类型不匹配。

问题分析:

  1. 首次错误The type of "permissionList" must be Array<string>.

    • 这表明 requestPermissionsFromUser 方法期望接收一个字符串数组(Array<string>),但你传入的是 Array<Permissions>Permissions 是一个联合类型(例如 'ohos.permission.CAMERA' | 'ohos.permission.MICROPHONE'),在编译时被识别为与 string 不同的类型。
  2. 修改后错误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 类型。

这样修改后,既满足了 requestPermissionsFromUserArray<string> 的运行时要求(因为 Permissions 本质是字符串的联合类型),又通过了编译时对 Permissions[] 的严格类型检查,从而解决闪退问题。

回到顶部