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 已授权, 语音输入可用');