HarmonyOS 鸿蒙Next中如何检查应用是否开启了麦克风权限
HarmonyOS 鸿蒙Next中如何检查应用是否开启了麦克风权限 如何检查应用是否开启了麦克风权限
【背景知识】 检查用户是否已向您的应用授予特定权限,可以使用checkAccessToken()函数,此方法会返回PERMISSION_GRANTED或PERMISSION_DENIED。
【解决方案】
- 以检查应用是否具备wifi权限、数据联网权限为例。参考代码如下:
- 申请ohos.permission.MICROPHONE权限。
- 通过调用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:允许应用使用麦克风。
【参考方案】
可参考口语跟读训练示例,通过AVRecorder和AVPlayer实现录制与播放音频效果。
点击录音前检查应用是否有麦克风权限。
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}`);
});
注意事项:
-
权限状态含义:
0
(已授权):应用已获得麦克风权限。-1
(未授权):应用未获得麦克风权限。2
(用户动态授权):权限需在运行时动态申请。
-
系统应用限制:方法二仅系统应用可用,且需申请
ohos.permission.GET_SENSITIVE_PERMISSIONS
权限。 -
错误处理:调用接口时需捕获错误,常见错误码如
12100001
(参数无效)、12100007
(服务异常)等。
在HarmonyOS鸿蒙Next中,通过权限管理模块检查麦克风权限状态。使用abilityAccessCtrl
API中的verifyAccessToken
方法,传入应用Bundle名称和权限类型ohos.permission.MICROPHONE
进行查询。返回值为PERMISSION_GRANTED
表示已授权,PERMISSION_DENIED
表示未授权。需在config.json中声明权限请求配置。
在HarmonyOS Next中,可以通过PermissionManager
类检查应用的麦克风权限状态。具体步骤如下:
- 导入权限管理模块:
import permissionManager from '@ohos.permissionManager';
- 使用
checkPermission
方法检查权限状态:
let permissionStatus = permissionManager.checkPermission('ohos.permission.MICROPHONE');
- 判断权限状态:
- 返回值为
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"
}
]
}
}