鸿蒙开发:申请授权权限

简介: 还是那句话,在申请权限的时候,应当严格遵循最小权限原则,结合动态申请和清晰的用户引导,避免给用户带来不好体验,同样,遵循,在使用到权限的时候再去申请,切记,过前进行申请。

前言


本文基于Api13。


通过前面两章的概述,关于权限的基本知识点已经概述的七七八八了,那么本篇文章,我们着重概述一下如何去申请权限。


问大家一个问题,向用户进行权限授权,是哪种授权方式呢?显然谜底就在谜面上,采用的是user_grant(用户授权)方式,当应用进行申请user_grant权限时,有以下两个步骤是必须要完成的。

1、在module.json5配置文件的requestPermissions标签中声明权限。

2、将应用中需要申请权限的目标对象与对应目标权限进行关联,让用户明确地知道,哪些操作需要用户向应用授予指定的权限。


约束限制


首先第一个,user_grant权限授权必须要让用户清晰知晓,需要在应用运行时,在需要的位置进行权限申请,不可未使用时就申请,比如一个拍照,需要调用系统的相机,不是一进入应用就直接申请,而是等到需要拍照权限的时候,再去申请。

第二个,申请权限的时候,如果用户拒绝授权了,这时是无法再次拉起弹窗的,这时需要正确的引导用户在系统应用“设置”的界面中手动授予权限。


第三个,系统权限弹窗优先级是最高的,不可被遮挡,弹窗信息需要完整展示,以便用户识别并完成授权动作。


第四个,每次要进行权限授权时,首先都必须要检查一下,是否拥有该权限,如果没有再去走申请逻辑。


第五个,如果是在onWindowStageCreate()回调中申请授权时,需要等待异步接口loadContent()/setUIContent()执行结束后或在loadContent()/setUIContent()回调中进行权限申请,否则在Content加载完成前,再申请权限时会调用失败。


权限申请流程


我们以申请相机的权限作为代码案例,看一下权限授权的流程。


1、权限声明


module.json5中进行配置。

"requestPermissions": [
      {
        "name": "ohos.permission.CAMERA",
        "reason": "$string:reason",
        "usedScene": {
          "abilities": [
            "EntryAbility"
          ],
          "when": "always"
        }
      }
    ]


2、检查授权


使用checkAccessToken()异步函数或者checkAccessTokenSync同步函数,检查用户是否已经授予了权限。

/**
   *AUTHOR:AbnerMing
   *INTRODUCE:校验应用是否被授予权限
   */
  private getGrantStatus(permissionName: Permissions): abilityAccessCtrl.GrantStatus {
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager()
    // 获取应用程序的accessTokenID
    let bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
    let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo
    let tokenId: number = appInfo.accessTokenId
    //检查权限状态
    let grantStatus = atManager.checkAccessTokenSync(tokenId, permissionName)
    return grantStatus
  }


以上的方法,会返回PERMISSION_GRANTED或PERMISSION_DENIED两个状态:


名称

说明

PERMISSION_DENIED

-1

表示未授权。

PERMISSION_GRANTED

0

表示已授权。


3、向用户申请授权


使用requestPermissionsFromUser()函数,来请求相应的权限:


/**
   *AUTHOR:AbnerMing
   *INTRODUCE:向用户获取权限授权
   */
  requestPermissionsFromUser(permissions: Array<Permissions>) {
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager()
    atManager.requestPermissionsFromUser(getContext(), permissions)
      .then((data) => {
        let grantStatus: Array<number> = data.authResults;
        let length: number = grantStatus.length;
        for (let i = 0; i < length; i++) {
          if (grantStatus[i] === 0) {
            // 用户授权,可以继续访问目标操作
            console.log("===用户授权")
          } else {
            // 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限
            console.log("===用户拒绝了授权")
            return
          }
        }
        console.log("===权限授权成功")
      })
  }


检查权限流程:


/**
   *AUTHOR:AbnerMing
   *INTRODUCE:检查用户权限
   */
  checkPermissions() {
    let permission: Permissions = "ohos.permission.CAMERA"
    let grantStatus = this.getGrantStatus(permission)
    if (grantStatus == abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
      //已有权限
      console.log("===已有权限")
    } else {
      //申请权限
      console.log("===没有权限,需要申请权限")
      this.requestPermissionsFromUser([permission])
    }
  }


运行程序后,就会弹出如下的权限申请弹窗,此弹窗是系统的,不可修改。


image.png

4、处理授权结果


如果权限已经授权,在这里可以执行后续的正常功能,如果权限未授权,我们可以继续给用户进行提示,让用户去系统应用“设置”中打开相应的权限,路径是:设置 > 隐私 > 权限管理 > 应用 > 目标应用。

一般我们可以调用requestPermissionOnSetting(),进行权限的二次授权。

/**
   *AUTHOR:AbnerMing
   *INTRODUCE:二次向用户申请授权
   */
  private requestPermissionOnSetting(permissions: Array<Permissions>) {
    abilityAccessCtrl.createAtManager().requestPermissionOnSetting(getContext(), permissions)
      .then((data: Array<abilityAccessCtrl.GrantStatus>) => {
        if (data[0] == abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
          //已有权限
          console.log("===已有权限")
        }
      })
  }


image.png


相关总结


还是那句话,在申请权限的时候,应当严格遵循最小权限原则,结合动态申请和清晰的用户引导,避免给用户带来不好体验,同样,遵循,在使用到权限的时候再去申请,切记,过前进行申请。


相关文章
|
7月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1342 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
7月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
998 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
7月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1088 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
8月前
|
存储 缓存 5G
鸿蒙 HarmonyOS NEXT端云一体化开发-云存储篇
本文介绍用户登录后获取昵称、头像的方法,包括通过云端API和AppStorage两种方式,并实现上传头像至云存储及更新用户信息。同时解决图片缓存问题,添加上传进度提示,支持自动登录判断,提升用户体验。
336 1
|
8月前
|
存储 负载均衡 数据库
鸿蒙 HarmonyOS NEXT端云一体化开发-云函数篇
本文介绍基于华为AGC的端云一体化开发流程,涵盖项目创建、云函数开通、应用配置及DevEco集成。重点讲解云函数的编写、部署、调用与传参,并涉及环境变量设置、负载均衡、重试机制与熔断策略等高阶特性,助力开发者高效构建稳定云端服务。
739 1
鸿蒙 HarmonyOS NEXT端云一体化开发-云函数篇
|
8月前
|
存储 JSON 数据建模
鸿蒙 HarmonyOS NEXT端云一体化开发-云数据库篇
云数据库采用存储区、对象类型、对象三级结构,支持灵活的数据建模与权限管理,可通过AGC平台或本地项目初始化,实现数据的增删改查及端侧高效调用。
408 1
|
8月前
|
存储 开发者 容器
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
本文介绍了ArkTS语言中的Class类、泛型、接口、模块化、自定义组件及状态管理等核心概念,并结合代码示例讲解了对象属性、构造方法、继承、静态成员、访问修饰符等内容,同时涵盖了路由管理、生命周期和Stage模型等应用开发关键知识点。
569 1
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
|
8月前
鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段三
本文介绍了UI开发中的样式复用与组件构建技术,涵盖@Extend、@Styles和@Builder的使用方法,并通过Swiper轮播、Scroll滚动、Tabs导航等常用组件实现典型界面效果,结合生肖抽卡、小米轮播、回顶按钮等案例,展示实际应用技巧。
215 1
|
7月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
372 0
|
8月前
|
传感器 监控 安全
HarmonyOS NEXT 5.0 的星闪(NearLink)开发应用案例
V哥分享HarmonyOS NEXT 5.0星闪开发实战,涵盖智能车钥匙无感解锁与工业传感器监控。低延迟、高可靠,代码完整,速来学习!
1041 0

热门文章

最新文章