HM-权限申请
鸿蒙应用开发–权限申请
授权方式
根据授权方式的不同,权限类型可分为system_grant(系统授权)和user_grant(用户授权)。
system_grant
指的是系统授权类型,在该类型的权限许可下,应用被允许访问的数据不会涉及到用户或设备的敏感信息,应用被允许执行的操作对系统或者其他应用产生的影响可控。
如果在应用中申请了system_grant
权限,那么系统会在用户安装应用时,自动把相应权限授予给应用。
user_grant
指的是用户授权类型,在该类型的权限许可下,应用被允许访问的数据将会涉及到用户或设备的敏感信息,应用被允许执行的操作可能对系统或者其他应用产生严重的影响。
该类型权限不仅需要在安装包中申请权限,还需要在应用动态运行时,通过发送弹窗的方式请求用户授权。在用户手动允许授权后,应用才会真正获取相应权限,从而成功访问操作目标对象。
例如,在应用权限列表中,麦克风和摄像头对应的权限都是属于用户授权权限,列表中给出了详细的权限使用理由。应用需要在应用商店的详情页面,向用户展示所申请的user_grant
权限列表。
申请用户权限
- 在
module.json5
文件中声明应用需要请求的权限,且要设置需要使用的场景+使用原因
// 权限申明
"requestPermissions": [
// 网络请求--系统权限
{ "name": "ohos.permission.INTERNET" },
// 麦克风权限 -- 用户权限
{
"name": "ohos.permission.MICROPHONE",
"usedScene": {},
"reason": "$string:reason_microphone" // 将来会自动显示在界面上告知用户
}
],
- 在
string
文件中写reason_microphone
注意:鸿蒙开发中,有三个string文件位置 base 、en_US 、zh_CN ,至少配两个,base是必须配的,
以中文模式为例,需要配置 zh_CN 和 base
// 里面还有其他的string值,这里只以reason_microphone为例
{
"string": [
{
"name": "reason_microphone",
"value": "面通App需要您授权麦克风才可以进行录音"
}
]
}
- 使用
abilityAccessCtrl
模块申请用户权限
const mgr = abilityAccessCtrl.createAtManager()
const firstReq = await mgr.requestPermissionsFromUser(getContext(this), ["ohos.permission.MICROPHONE"])
// 判断用户是否授权
// 申请授权的时候是一个数组,res.authResults是一个数组
if (firstReq.authResults[0] === abilityAccessCtrl.GrantStatus.PERMISSION_DENIED) {
const showSelect = await promptAction.showDialog({
title: '温馨提示',
message: '未授权使用麦克风将无法使用该面试录音功能,是否前往设置进行授权?',
buttons: [
{ text: '离开', color: '#cccccc' },
{ text: '去授权', color: '#000000' },
]
})
- 二次授权有多种模式,首推第一种
第一种:app内唤起设置中心
使用requestPermissionOnSetting
和首次申请授权requestPermissionsFromUser
的使用方法一样
// 弹窗返回选择结果,和button位置对应
// '离开'-- 0 '去授权'--1
// 同意二次授权
if (showSelect.index) { // showSelect是上面showDialog弹窗返回的用户选择结果
// 拉起二次授权面板
const secondReq = await mgr.requestPermissionOnSetting(getContext(this), ["ohos.permission.MICROPHONE"])
// 二次拒绝
if (secondReq[0] === abilityAccessCtrl.GrantStatus.PERMISSION_DENIED) {
promptAction.showToast({ message: '授权失败' })
router.pushUrl({ url: '/pages/Index'.slice(1) })
}
}
第二种方法:跳转到设置中心的应用管理 参考文档 startAbility
该方法也适用于其他应用唤起或跳转
if (showSelect.index) { // showSelect是上面showDialog弹窗返回的用户选择结果
let want: Want = {
bundleName: 'com.huawei.hmos.settings', // 要跳转到的应用包名
abilityName: 'com.huawei.hmos.settings.MainAbility', // 跳转到的模块ability名
uri: 'application_info_entry', // 这是设置下应用与元服务的uri
parameters: {
pushParams: 'com.example.interviewproject' // 应用服务下,自己应用的包名
}
};
const context = getContext(this) as common.UIAbilityContext
context.startAbility(want)
}
注意:pushParams
是要填写自己应用的包名,该名字在app.json5
文件中查看
第三种方法:
// 声明FunctionalButton
FunctionalButton({
params: {
// OpenType.OPEN_SETTING表示Button为打开授权设置页类型
openType: functionalButtonComponentManager.OpenType.OPEN_SETTING,
label: '去设置页授权',
// 调整Button样式
styleOption: {
styleConfig: new functionalButtonComponentManager.ButtonConfig()
.fontSize(20)
.fontColor(Color.Black)
.backgroundColor(Color.White)
}
},
代码实例:
async getPermissions() {
// 授权控制器
const mgr = abilityAccessCtrl.createAtManager()
// 获取用户授权
const firstReq = await mgr.requestPermissionsFromUser(getContext(this), ["ohos.permission.MICROPHONE"])
// 判断用户是否授权
// 申请授权的时候是一个数组,res.authResults是一个数组
if (firstReq.authResults[0] === abilityAccessCtrl.GrantStatus.PERMISSION_DENIED) {
const showSelect = await promptAction.showDialog({
title: '温馨提示',
message: '未授权使用麦克风将无法使用该面试录音功能,是否前往设置进行授权?',
buttons: [
{ text: '离开', color: '#cccccc' },
{ text: '去授权', color: '#000000' },
]
})
// 弹窗返回选择结果,和button位置对应
// '离开'-- 0 '去授权'--1
// 同意二次授权
if (showSelect.index) {
// 拉起二次授权面板
const secondReq = await mgr.requestPermissionOnSetting(getContext(this), ["ohos.permission.MICROPHONE"])
// 二次拒绝
if (secondReq[0] === abilityAccessCtrl.GrantStatus.PERMISSION_DENIED) {
promptAction.showToast({ message: '授权失败' })
router.pushUrl({ url: '/pages/Index'.slice(1) })
}
}
}
}
封装成Permission类
权限申请类:
getPermission 方法:
参数: permission: Permissions[ ] 返回 isAgree : boolean
openPermissionSetting 方法:
参数: permission: Permissions[ ] 返回 isAgree : boolean
注意: **requestPermissionOnSetting**
比较特殊,其需要同组权限数组才能被唤起,不同组的多个权限数组无法唤起
import { abilityAccessCtrl, Permissions } from "@kit.AbilityKit"
export class Permission {
// 创建权限管理器
static mgr = abilityAccessCtrl.createAtManager()
static ctx = getContext()
// 向用户请求权限
static async getPermission(permission: Permissions[]) {
// 首次申请用户权限
const firstReq = await Permission.mgr.requestPermissionsFromUser(Permission.ctx, permission)
// 判断用户是否授权,有可能一次会有多个授权
const isAgree = firstReq.authResults.every(item => item === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
return isAgree
}
// 打开权限设置中心
static async openPermissionSetting(permission: Permissions[]) {
// 二次拉起授权
const secondReq = await Permission.mgr.requestPermissionOnSetting(Permission.ctx, permission)
const isAgree = secondReq.every(item => item === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
return isAgree
}
}
使用案例:
// 首次请求权限
const isAgree = await Permission.getPermission(['ohos.permission.MICROPHONE'])
if (isAgree) {
return
}
const res = await promptAction.showDialog({
title: "温馨提示",
message: "未授权使用麦克风将无法使用该面试录音功能,是否前往设置进行授权?",
buttons: [
{ text: '离开', color: $r('app.color.common_gray_01') },
{ text: '去授权', color: '#000000' }
]
})
// 点击离开
if (res.index === 0) {
router.back()
return
}
// 二次拉起授权
const isAgree2 = await Permission.openPermissionSetting(['ohos.permission.MICROPHONE'])
// 二次取消授权
if (!isAgree2) {
router.back()
return
}