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:
13
readme.md
13
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 且**不弹窗**,所以实际只有首次启动打扰用户一次
|
||||
|
||||
@@ -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 已授权, 语音输入可用');
|
||||
|
||||
Reference in New Issue
Block a user