fix:麦克风权限 Permissions 类型用法修正

上一提交写成 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 补充该类型坑说明。
This commit is contained in:
2026-10-17 11:53:44 +08:00
parent 9086f1665c
commit 550ec72bb7
2 changed files with 22 additions and 1 deletions

View File

@@ -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 且**不弹窗**,所以实际只有首次启动打扰用户一次

View File

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