From 550ec72bb7a0c923c26ac600183dfea8f3290a3f Mon Sep 17 00:00:00 2001 From: ZF sun <34314687@qq.com> Date: Sat, 17 Oct 2026 11:53:44 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A=E9=BA=A6=E5=85=8B=E9=A3=8E?= =?UTF-8?q?=E6=9D=83=E9=99=90=20Permissions=20=E7=B1=BB=E5=9E=8B=E7=94=A8?= =?UTF-8?q?=E6=B3=95=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 上一提交写成 Permissions.MICROPHONE 导致 CompileArkTS 失败: 'Permissions' only refers to a type, but is being used as a value here Permissions 在 @ohos.permissions 中是 export type 字符串联合类型, 不是枚举, 只能用在类型位置。改为类型标注 + 权限名字面量: const PERMISSION_MICROPHONE: Permissions = 'ohos.permission.MICROPHONE'; 注意 abilityAccessCtrl 里的 SwitchType.MICROPHONE(=1) 是开关类型枚举, 与权限名无关, 容易误用。 readme 4.3.3 补充该类型坑说明。 --- readme.md | 13 +++++++++++++ .../src/main/ets/entryability/EntryAbility.ets | 10 +++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 33853d8..3ac20d8 100644 --- a/readme.md +++ b/readme.md @@ -195,6 +195,19 @@ onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { > ⚠️ **坑**:`AscfUIAbility` 父类**已定义** `onCreate`,重写时必须调 `super.onCreate(want, launchParam)`,否则 ascf runtime 初始化被跳过,元服务白屏。 +> ⚠️ **坑**:`Permissions` 在 `@ohos.permissions` 里是**字符串联合类型**([permissions.d.ts](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-ability-kit/js-apis-permissions.md)),不是枚举,**只能用在类型位置**,当值引用会报: +> ``` +> 'Permissions' only refers to a type, but is being used as a value here. +> ``` +> 所以正确写法是标注 + 字面量,且权限名必须与 `module.json5` 中声明的一致: +> ```ts +> import { abilityAccessCtrl, AbilityConstant, Permissions, Want } from '@kit.AbilityKit'; +> +> const PERMISSION_MICROPHONE: Permissions = 'ohos.permission.MICROPHONE'; +> // ❌ Permissions.MICROPHONE —— 编译不过 +> // ⚠️ abilityAccessCtrl.SwitchType.MICROPHONE(=1) 是"开关类型",不是权限名,别搞混 +> ``` + 📌 为什么在 `onCreate` 申请而不是"用户点录音时才申请": - 权限状态在 JS 侧(`uni.getRecorderManager`)读不到,项目里也没有现成的 JS ↔ ArkTS 通道,做不了按需触发 - `requestPermissionsFromUser` 对已授权的应用直接 resolve 且**不弹窗**,所以实际只有首次启动打扰用户一次 diff --git a/stub-app-projects/mp-harmony/entry/src/main/ets/entryability/EntryAbility.ets b/stub-app-projects/mp-harmony/entry/src/main/ets/entryability/EntryAbility.ets index 566fb15..8983402 100644 --- a/stub-app-projects/mp-harmony/entry/src/main/ets/entryability/EntryAbility.ets +++ b/stub-app-projects/mp-harmony/entry/src/main/ets/entryability/EntryAbility.ets @@ -2,6 +2,14 @@ import { abilityAccessCtrl, AbilityConstant, Permissions, Want } from '@kit.Abil import { BusinessError } from '@kit.BasicServicesKit'; import { AscfUIAbility } from '@atomicservice/ascfapi'; +// ⚠️ Permissions 在 @ohos.permissions 里是**字符串联合类型**, 不是枚举, +// 只能用在类型位置 (如这里的标注), 不能当值引用 (Permissions.MICROPHONE 会报 +// "'Permissions' only refers to a type, but is being used as a value here"), +// 所以权限名必须写字面量, 且要与 module.json5 中声明的一致。 +// 另外别被 abilityAccessCtrl 里的 SwitchType 枚举误导, 它的 MICROPHONE=1 是 +// 开关类型, 不是权限名。 +const PERMISSION_MICROPHONE: Permissions = 'ohos.permission.MICROPHONE'; + export default class EntryAbility extends AscfUIAbility { onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { // 必须先调父类: ascf runtime 的初始化在 AscfUIAbility.onCreate 里, 漏掉会导致元服务白屏 @@ -25,7 +33,7 @@ export default class EntryAbility extends AscfUIAbility { private async requestMicrophonePermission(): Promise { try { const atManager = abilityAccessCtrl.createAtManager(); - const result = await atManager.requestPermissionsFromUser(this.context, [Permissions.MICROPHONE]); + const result = await atManager.requestPermissionsFromUser(this.context, [PERMISSION_MICROPHONE]); const authResult = result.authResults[0]; if (authResult === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) { console.info('[EntryAbility] MICROPHONE 已授权, 语音输入可用');