首页 > 其他分享 >【鸿蒙开发】超全面解读 带你充分掌握---“向用户申请授权”

【鸿蒙开发】超全面解读 带你充分掌握---“向用户申请授权”

时间:2024-11-23 17:58:19浏览次数:11  
标签:解读 鸿蒙 申请 用户 --- let 应用 授权 权限

系列文章目录

【鸿蒙开发】鸿蒙开发基础干货篇–1
【鸿蒙开发】基础干货篇–2 小白入门手册(内含Dev Eco安装教程和汉化插件安装)
【鸿蒙开发】基础干货篇–3 小白入门手册 (内含模拟器保姆级安装使用教程)
【鸿蒙开发】基础干货篇–4 小白入门手册(内含Stage模型工程目录结构和UIAbility 组件详解)
【鸿蒙开发】基础干货篇–5 “一篇带你掌握应用状态”
【鸿蒙开发】基础干货篇–6 “超简单持久化存储PersistentStorage”
【鸿蒙开发】基础干货篇–7 “一篇带你掌握三种页面跳转”
【鸿蒙开发】“一篇带你掌握HAP、HAR、HSP”
【鸿蒙开发】超全面解读 带你充分掌握—“应用沉浸式效果开发”


文章目录


前言

应用在访问数据或者执行操作时,需要评估该行为是否需要应用具备相关的权限。如果确认需要目标权限,则需要在应用安装包中申请目标权限。


提示:我们先了解一下授权方式
根据授权方式的不同,权限类型可分为system_grant(系统授权)和user_grant(用户授权)。

  • system_grant指的是系统授权类型,在该类型的权限许可下,应用被允许访问的数据不会涉及到用户或设备的敏感信息。
    如果在应用中申请了system_grant权限,那么系统会在用户安装应用时,自动把相应权限授予给应用

  • user_grant指的是用户授权类型,在该类型的权限许可下,应用被允许访问的数据将会涉及到用户或设备的敏感信息。
    该类型权限不仅需要在安装包中申请权限,还需要在应用动态运行时,通过发送弹窗的方式请求用户授权。在用户手动允许授权后,应用才会真正获取相应权限,从而成功访问操作目标对象。

一、选择申请权限的方式

每一个权限的权限等级、授权方式不同,申请权限的方式也不同,开发者在申请权限前,需要先根据以下流程判断应用能否申请目标权限。

在这里插入图片描述

二、声明权限

应用在申请权限时,需要在项目的配置文件中,逐个声明需要的权限,否则应用将无法获取授权。

应用需要在module.json5配置文件的requestPermissions标签中声明权限。

属性含义
name需要使用的权限名称。
reason申请权限的原因。
usedScene权限使用的场景,该字段用于应用上架校验。包括abilities和when两个子项。

说明: 已在子模块中申请的权限,无需在主项目重复添加,权限将在整个应用生效。

样例:

{
  "module" : {
    // ...
    "requestPermissions":[
      {
        "name" : "ohos.permission.PERMISSION1",
        "reason": "$string:reason",
        "usedScene": {
          "abilities": [
            "FormAbility"
          ],
          "when":"inuse"
        }
      },
      {
        "name" : "ohos.permission.PERMISSION2",
        "reason": "$string:reason",
        "usedScene": {
          "abilities": [
            "FormAbility"
          ],
          "when":"always"
        }
      }
    ]
  }
}

1.reason字段的内容写作规范及建议

  1. 字串应为直白、具体、易理解的完整短句, 用于向用户说明应用使用敏感权限的理由。句子避免使用被动语态,并以句号结尾。建议句式:用于做某事。
  • 用途描述的字串建议小于72个字符(即36个中文字符,UI界面显示大约为两行)。不能超过256个字符,以保证多语言适配的体验。
  • 字串不能为空白字符串,即不能不填,也不能只填空格符。
  1. 如果应用申请的权限用于多个场景,需要确保字串的完整性,让用户了解应用使用此权限的所有场景;多个HAP包内如果申请同一个权限,各个权限Reason字段需要保持场景的完整性和一致性。

2.权限使用理由展示方式

权限使用理由有两个展示途径:授权弹窗界面和“设置(Settings)”界面。“设置”的具体路径:设置-隐私-权限管理-某应用某权限详情。

三、向用户申请授权

当应用申请user_grant权限时,需要完成以下步骤:

  1. 在配置文件中,声明应用需要请求的权限
  2. 将应用中需要申请权限的目标对象与对应目标权限进行关联,让用户明确地知道,哪些操作需要用户向应用授予指定的权限。

以上两步请参考声明权限完成。

  1. 运行应用时,在用户触发访问操作目标对象时应该调用接口,精准触发动态授权弹框。该接口的内部会检查当前用户是否已经授权应用所需的权限,如果当前用户尚未授予应用所需的权限,该接口会拉起动态授权弹框,向用户请求授权。
  2. 检查用户的授权结果,确认用户已授权才可以进行下一步操作。

以申请使用位置权限为例进行说明:
1.申请ohos.permission.LOCATION、ohos.permission.APPROXIMATELY_LOCATION权限,配置方式请参见声明权限。

2.校验当前是否已经授权。

import { abilityAccessCtrl, bundleManager, Permissions } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

async function 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);
    let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
    tokenId = appInfo.accessTokenId;
  } 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);
  } 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 function checkPermissions(): Promise<void> {
  let grantStatus1: boolean = await checkPermissionGrant('ohos.permission.LOCATION') === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED;// 获取精确定位权限状态
  let grantStatus2: boolean = await checkPermissionGrant('ohos.permission.APPROXIMATELY_LOCATION') === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED;// 获取模糊定位权限状态
  // 精确定位权限只能跟模糊定位权限一起申请,或者已经有模糊定位权限才能申请精确定位权限
  if (grantStatus2 && !grantStatus1) {
     // 申请精确定位权限
  } else if (!grantStatus1 && !grantStatus2) {
     // 申请模糊定位权限与精确定位权限或单独申请模糊定位权限
  } else {
     // 已经授权,可以继续访问目标操作
  }
}

3.动态向用户申请授权。

// 使用UIExtensionAbility:将import { UIAbility } from '@kit.AbilityKit' 替换为import { UIExtensionAbility } from '@kit.AbilityKit';
import { abilityAccessCtrl, common, Permissions, UIAbility } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';

const permissions: Array<Permissions> = ['ohos.permission.LOCATION','ohos.permission.APPROXIMATELY_LOCATION'];
// 使用UIExtensionAbility:将common.UIAbilityContext 替换为common.UIExtensionContext
function reqPermissionsFromUser(permissions: Array<Permissions>, context: common.UIAbilityContext): void {
  let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
  // requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
  atManager.requestPermissionsFromUser(context, 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) {
        // 用户授权,可以继续访问目标操作
      } else {
        // 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限
        return;
      }
    }
    // 授权成功
  }).catch((err: BusinessError) => {
    console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
  })
}
// 使用UIExtensionAbility:将 UIAbility 替换为UIExtensionAbility
export default class EntryAbility extends UIAbility {
  onWindowStageCreate(windowStage: window.WindowStage): void {
    // ...
    windowStage.loadContent('pages/Index', (err, data) => {
      reqPermissionsFromUser(permissions, this.context);
    // ...
    });
  }

  // ...
}

4.处理授权结果
调用requestPermissionsFromUser()方法后,应用程序将等待用户授权的结果。如果用户授权,则可以继续访问目标操作。如果用户拒绝授权,则需要提示用户必须授权才能访问当前页面的功能,并引导用户到系统应用“设置”中打开相应的权限。

路径:设置 > 隐私 > 权限管理 > 应用 > 目标应用

标签:解读,鸿蒙,申请,用户,---,let,应用,授权,权限
From: https://blog.csdn.net/i20021209/article/details/143988745

相关文章

  • 题目集4~6的总结性Blog 22207208-贺凯凯
    一,前言在本系列的第四至第六题目集中,我们深入探讨了智能家居和强电电路的模拟系统,并完善了答题判断程序。第4题主要聚焦于答题程序的设计与实现,要求我们实现一个多种信息输入、处理和输出的模拟考试系统,涵盖了题目信息、学生答题信息、试卷管理等模块的设计与判断逻辑,涉及较为复......
  • 2024-2025-1 20241407《计算机基础与程序设计》第九周学习总结
    作业信息这个作业属于哪个课程2024-2025-1计算机基础与程序设计这个作业要求在哪里2024-2025-1计算机基础与程序设计第九周作业这个作业的目标操作系统责任,内存与进程管理,分时系统,CPU调度,文件、文件系统,文件保护,磁盘调度作业正文本博客教材学习内容总结......
  • YOLOv11改进策略【Head】| 结合CVPR-2024 中的DynamicConv 动态卷积 改进检测头, 优化
    一、本文介绍本文记录的是利用DynamicConv优化YOLOv11的目标检测网络模型。在大规模训练中,模型的参数量越多,FLOPs也越高,但在一些对计算资源有限制的场景下,需要低FLOPs的模型同时又希望模型能从大规模预训练中受益。传统的方法很难在增加参数的同时保持低FLOPs,因此Dynamic......
  • 2024-2025-1 20241328 《计算机基础与程序设计》第九周学习总结
    2024-2025-120241328《计算机基础与程序设计》第九周学习总结作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里2024-2025-1计算机基础与程序设计第一周作业这个作业的目标-操作系统责任-内存与进程管理-分时系统-CPU调......
  • C++-第26课-哈希表:从概念到实现的深入剖析
    目录......
  • Scaffold-GS: Structured 3D Gaussians for View-Adaptive Rendering (Related work)
    MLP-basedNeuralFieldsandRenderingEarlyneuralfieldstypicallyadoptamulti-layerperceptron(MLP)astheglobalapproximatorof3Dscenegeometryandappearance.Theydirectlyusespatialcoordinatesandviewingdirection asinputtotheMLPandpr......
  • 高频脑电磁波的接收与解读:基于兆赫兹频段信号的检测技术探索
    摘要本文探讨了利用先进的高频脑电磁波接收技术,特别是针对兆赫兹频段(20kHz至50MHz)的脑电波信号,提出了一种集成高增益天线、窄带带通滤波器和超导量子干涉装置(DCSQUID)的接收与解码系统。通过这种技术可以在特定条件下提取并放大大脑的高频脑电信号,进行功率谱分析,并与特定认知任务......
  • 2024年全国青少年信息素养大赛-算法创意实践C++ 华中赛区 (小学组 初赛)
    算法创意实践C++初赛完整的试卷请前往题库中心,在线刷题更方便,更高效,支持刷题模式和限时考试模式~https://www.hixinao.com/tidan/exam-97.html?time=1732236840&sid=165&index=4......
  • 深圳大学-算法设计与分析-实验2-分治法求最近点对问题
    前言说明一门没什么意义的课程,学算法不如直接刷题,这门课纯答辩,本人写的报告也很答辩,可能还有错误,仅供参考,慎抄!实验目的(1)掌握分治法思想。(2)学会最近点对问题求解方法。实验内容对于平面上给定的N个点,给出所有点对的最短距离,即,输入是平面上的N个点,输出是N点中具有最短......
  • 深圳大学-算法设计与分析-实验4-动态规划(鸡蛋掉落问题)
    前言说明一门没什么意义的课程,学算法不如直接刷题,这门课纯答辩,本人写的报告也很答辩,可能还有错误,仅供参考,慎抄!实验目的(1)掌握动态规划算法设计思想。(2)掌握鸡蛋坠落问题的动态规划解法。实验内容动态规划将问题划分为更小的子问题,通过子问题的最优解来重构原问题的最......