HarmonyOS 鸿蒙Next中如何检查应用是否开启了麦克风权限

HarmonyOS 鸿蒙Next中如何检查应用是否开启了麦克风权限 如何检查应用是否开启了麦克风权限

5 回复

【背景知识】 检查用户是否已向您的应用授予特定权限,可以使用checkAccessToken()函数,此方法会返回PERMISSION_GRANTEDPERMISSION_DENIED

【解决方案】

  • 以检查应用是否具备wifi权限、数据联网权限为例。参考代码如下:
    1. 申请ohos.permission.MICROPHONE权限。
    2. 通过调用checkAccessToken()方法来校验当前是否已经授权。
import { abilityAccessCtrl, bundleManager, Permissions } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

@Entry
@Component
struct Index {
  @State message: string = '点击权限检查';
  @State mircoStatus: boolean = false;

  build() {
    RelativeContainer() {
      Text(this.message)
        .id('权限检查')
        .fontSize(18)
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(() => {
          this.checkPermissions();
        })
    }
    .height('100%')
    .width('100%')
  }

  async checkPermissionGrant(permission: Permissions): Promise<abilityAccessCtrl.GrantStatus> {
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;
    // 获取应用程序的accessTokenID。
    let tokenId: number = 0;
    try {
      let bundleInfo: bundleManager.BundleInfo =
        await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION); // 获取包含应用信息的 BundleInfo,比如应用名称、应用包名、应用组件
      let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
      tokenId = appInfo.accessTokenId;  // 获取`tokenId` ,它是 HarmonyOS 中用于应用权限管理的一个关键标识符
    } catch (error) {
      const err: BusinessError = error as BusinessError;
      console.error(`Failed to get bundle info for self. Code is ${err.code}, message is ${err.message}`);
    }

    // 校验应用是否被授予权限。
    try {
      grantStatus = await atManager.checkAccessToken(tokenId, permission);  // `checkAccessToken` 是 `atManager` 对象上的一个方法,用于验证给定的令牌ID和权限是否有效。
    } catch (error) {
      const err: BusinessError = error as BusinessError;
      console.error(`Failed to check access token. Code is ${err.code}, message is ${err.message}`);
    }
    return grantStatus;
  }

  async checkPermissions(): Promise<void> {
    let grantStatus: boolean = await this.checkPermissionGrant('ohos.permission.MICROPHONE') ===
    abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED;
    console.info("麦克风权限:" + grantStatus);
    this.mircoStatus = grantStatus;
    this.message = "麦克风权限:" + this.mircoStatus;
    return;
  }
}

更多关于HarmonyOS 鸿蒙Next中如何检查应用是否开启了麦克风权限的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


【背景知识】

ohos.permission.MICROPHONE:允许应用使用麦克风。

【参考方案】

可参考口语跟读训练示例,通过AVRecorderAVPlayer实现录制与播放音频效果。

点击录音前检查应用是否有麦克风权限。

static async requestPermissionsFromUser(permission: Permissions, context: common.UIAbilityContext) {
  const atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
  let result = await atManager.requestPermissionsFromUser(context, [permission]);
  return result.authResults[0] === 0;
}

方法一:使用 abilityAccessCtrl 模块的 getSelfPermissionStatus 方法(同步查询)

适用场景:普通应用查询自身权限状态。
系统能力:SystemCapability.Security.AccessToken
参数

  • permissionName:权限名称(此处为 'ohos.permission.MICROPHONE')。

返回值

  • PermissionStatus 枚举值:
    • -1(未授权)
    • 0(已授权)
    • 2(用户动态授权)

示例代码

import { abilityAccessCtrl } from '@kit.AbilityKit';

let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
try {
  let status: abilityAccessCtrl.PermissionStatus = atManager.getSelfPermissionStatus('ohos.permission.MICROPHONE');
  console.info(`Microphone permission status: ${status}`); // 返回 -1、0 或 2
} catch (err) {
  console.error(`Query failed: ${JSON.stringify(err)}`);
}

方法二:使用 getPermissionsStatus 方法(系统应用专用,异步查询)

适用场景:系统应用查询指定应用的权限状态(需权限 ohos.permission.GET_SENSITIVE_PERMISSIONS)。
系统能力:SystemCapability.Security.AccessToken
参数

  • tokenID:目标应用的身份标识(可通过 bundleManager 获取)。
  • permissionList:权限名称列表(如 ['ohos.permission.MICROPHONE'])。

返回值

  • Promise<Array<PermissionStatus>>,返回权限状态数组(对应输入权限列表的顺序)。

示例代码

import { abilityAccessCtrl } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
let tokenID: number = 0; // 需替换为目标应用的 tokenID
atManager.getPermissionsStatus(tokenID, ['ohos.permission.MICROPHONE']).then((data: Array<abilityAccessCtrl.PermissionStatus>) => {
  console.info(`Microphone permission status: ${data[0]}`);
}).catch((err: BusinessError) => {
  console.error(`Query failed: ${err}`);
});

注意事项:

  1. 权限状态含义

    • 0(已授权):应用已获得麦克风权限。
    • -1(未授权):应用未获得麦克风权限。
    • 2(用户动态授权):权限需在运行时动态申请。
  2. 系统应用限制:方法二仅系统应用可用,且需申请 ohos.permission.GET_SENSITIVE_PERMISSIONS 权限。

  3. 错误处理:调用接口时需捕获错误,常见错误码如 12100001(参数无效)、12100007(服务异常)等。

在HarmonyOS鸿蒙Next中,通过权限管理模块检查麦克风权限状态。使用abilityAccessCtrl API中的verifyAccessToken方法,传入应用Bundle名称和权限类型ohos.permission.MICROPHONE进行查询。返回值为PERMISSION_GRANTED表示已授权,PERMISSION_DENIED表示未授权。需在config.json中声明权限请求配置。

在HarmonyOS Next中,可以通过PermissionManager类检查应用的麦克风权限状态。具体步骤如下:

  1. 导入权限管理模块:
import permissionManager from '@ohos.permissionManager';
  1. 使用checkPermission方法检查权限状态:
let permissionStatus = permissionManager.checkPermission('ohos.permission.MICROPHONE');
  1. 判断权限状态:
  • 返回值为0表示有权限(GRANTED
  • 返回值为-1表示无权限(DENIED

示例代码:

let status = permissionManager.checkPermission('ohos.permission.MICROPHONE');
if (status === 0) {
    console.log('麦克风权限已开启');
} else {
    console.log('麦克风权限未开启');
}

注意:需要在module.json5中声明麦克风权限:

{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.MICROPHONE"
      }
    ]
  }
}
回到顶部