HM-权限申请

鸿蒙应用开发–权限申请

授权方式

根据授权方式的不同,权限类型可分为system_grant(系统授权)user_grant(用户授权)。

system_grant指的是系统授权类型,在该类型的权限许可下,应用被允许访问的数据不会涉及到用户或设备的敏感信息,应用被允许执行的操作对系统或者其他应用产生的影响可控。

如果在应用中申请了system_grant权限,那么系统会在用户安装应用时,自动把相应权限授予给应用。

user_grant指的是用户授权类型,在该类型的权限许可下,应用被允许访问的数据将会涉及到用户或设备的敏感信息,应用被允许执行的操作可能对系统或者其他应用产生严重的影响。

该类型权限不仅需要在安装包中申请权限,还需要在应用动态运行时,通过发送弹窗的方式请求用户授权。在用户手动允许授权后,应用才会真正获取相应权限,从而成功访问操作目标对象。

例如,在应用权限列表中,麦克风和摄像头对应的权限都是属于用户授权权限,列表中给出了详细的权限使用理由。应用需要在应用商店的详情页面,向用户展示所申请的user_grant权限列表。

申请用户权限

  1. module.json5文件中声明应用需要请求的权限,且要设置需要使用的场景+使用原因
// 权限申明
"requestPermissions": [
  // 网络请求--系统权限  
  { "name": "ohos.permission.INTERNET" },  
  // 麦克风权限 -- 用户权限
  {
    "name": "ohos.permission.MICROPHONE",
    "usedScene": {},
    "reason": "$string:reason_microphone"  // 将来会自动显示在界面上告知用户
  }
],
  1. string文件中写reason_microphone

注意:鸿蒙开发中,有三个string文件位置 base 、en_US 、zh_CN ,至少配两个,base是必须配的,

以中文模式为例,需要配置 zh_CN 和 base

// 里面还有其他的string值,这里只以reason_microphone为例
{
  "string": [
     {
      "name": "reason_microphone",
      "value": "面通App需要您授权麦克风才可以进行录音"
    }
  ]
}
  1. 使用abilityAccessCtrl模块申请用户权限
const mgr = abilityAccessCtrl.createAtManager()
const firstReq = await mgr.requestPermissionsFromUser(getContext(this), ["ohos.permission.MICROPHONE"])

image.png

// 判断用户是否授权
// 申请授权的时候是一个数组,res.authResults是一个数组
if (firstReq.authResults[0] === abilityAccessCtrl.GrantStatus.PERMISSION_DENIED) {
  const showSelect = await promptAction.showDialog({
    title: '温馨提示',
    message: '未授权使用麦克风将无法使用该面试录音功能,是否前往设置进行授权?',
    buttons: [
      { text: '离开', color: '#cccccc' },
      { text: '去授权', color: '#000000' },
    ]
})

image.png

  1. 二次授权有多种模式,首推第一种

第一种: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) })
    }
  }

image.png

第二种方法:跳转到设置中心的应用管理 参考文档 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文件中查看

recording.gif

第三种方法:

 // 声明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
 }

HM-权限申请
http://example.com/posts/20117.html
作者
John Doe
发布于
2024年10月28日
许可协议