使用app的时候都清楚,想使用麦克风、摄像头,存储照片等,都需要调用系统的权限,没有手机操作系统权限你也使用不了app所提供的功能,虽然app可以正常打开,但是你需要的功能是没办法使用的。今天把自己在鸿蒙学习中遇到的问题打算记录下来,并整理成自己的学习之路,今天来说一下麦克风的权限的开启。
在EntryAbility.ets中,在oncreate函数里,没有加载页面的时候去申请一下系统权限。代码如下:
async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
hilog.info(0x0000, ‘testTag’, ‘%{public}s’, ‘Ability onCreate’);
//一进app进行的权限申请(必须),不然页面调用麦克风权限没有麦克风勾选
let manager= abilityAccessCtrl.createAtManager()
await manager.requestPermissionsFromUser(this.context,['ohos.permission.MICROPHONE'])
}
需要创建一个manager,manager中有个获取权限的函数,参数的context,一个是你需要获取的麦克风权限。至于为什么异步。是获取权限的函数是需要等待的返回值是Promis看见这种返回值的都是需要等待的,如果不想写await 函数名前加async也可以(.then)然后写回调函数,就是请求后返回一个结果,至于你怎么处理根据你的需求来。至少这一点和unity的开发相关性不大,一般是在task任务需要异步等待,前面的代码是第一步,至于为什么是第一步,上边代码有注释。就是你必须需要,真机上不知道可不可以,但是模拟器上是需要这么操作,如果一开始使用者禁用了app的权限申请,那么在使用权限的地方再次申请也可以。
第二步:
先上代码:
async checkViocePermission() {
let manager = abilityAccessCtrl.createAtManager()
//这里不能直接请求是因为需要在应用里跳转到设置去请求打开应用的权限
//manager.requestPermissionsFromUser()
//获取应用信息
let bundleinfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
//检测当前这个应用有没有获取到麦克风授权
let status = manager.checkAccessTokenSync(bundleinfo.appInfo.accessTokenId, ‘ohos.permission.MICROPHONE’)
if (status === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {//如果授予了this.showVioceCom = true
} else {//如果没授予跳转到设置应用 把当前的app信息传过去,然后去授予权限let UIAbilityContext = getContext() as common.UIAbilityContextlet want:Want={bundleName:'com.huawei.hmos.settings',abilityName:'com.huawei.hmos.settings.MainAbility',uri:'application_info_entry',parameters:{pushParams:bundleinfo.name}}
await UIAbilityContext.startAbility(want)
}
代码解释是这样的:至于这段代码为什么没有直接申请
//这里不能直接请求是因为需要在应用里跳转到设置去请求打开应用的权限
//manager.requestPermissionsFromUser()
在模拟器中调用是是没反应的,就是说这个页面中去申请权限这么写是不行,不能像在EntryAbility中去使用,必须使用其他的办法。
就是上述代码中,你先去获取到应用的信息就是这个bundleinfo。我的理解是所有的应用,包括鸿蒙系统的应用都被管理就是这个bundleManager在管理,他有个函数就是获取包的信息getBundleInfoForSelfSync,参数是BundleFlag,是个枚举,有很多选择,这里就不一一介绍了
*用于获取包含 applicationInfo 的 bundleInfo。获取的 bundleInfo 不会
- 包含 signatureInfo、hapModuleInfo、ability、extensionAbility 和 permission 等信息。
- 获取到应用信息后,需要根本manager去检测你这个app有没有获取到你需要的权限,本章是获取的麦克风权限
- let status = manager.checkAccessTokenSync(bundleinfo.appInfo.accessTokenId, ‘ohos.permission.MICROPHONE’)
- 返回一个abilityAccessCtrl.GrantStatus的枚举,判断一下呗,如果PERMISSION_GRANTED就是获取了,然后你可以做你想要的事情,
- 反之就是没授权,没有授权就跳到设置的Ability然后把你当前的需要授权的app信息传过去就可以去授权。
- //如果没授予跳转到设置应用 把当前的wechat信息传过去,然后去授予权限
let UIAbilityContext = getContext() as common.UIAbilityContext
let want:Want={bundleName:‘com.huawei.hmos.settings’,
abilityName:‘com.huawei.hmos.settings.MainAbility’,
uri:‘application_info_entry’,
parameters:{pushParams:bundleinfo.name}
}
await UIAbilityContext.startAbility(want)
完整的截图看一下
如果一开始选择允许,那么以后不会再出现权限获取的弹窗了,如果禁止,那么在打开页面后,在你需要获取的地方需要获取权限
如果一开始没有再entryability中获取,是不会有麦克风的选择的,至少模拟器是这样。