我可以: 邀请好友来看>>
ZOL星空(中国) > 软件星空(中国) > 星空(中国)综合 > 业界资讯星空(中国) > 鸿蒙开发:申请授权权限
帖子很冷清,卤煮很失落!求安慰
返回列表
签到
手机签到经验翻倍!
快来扫一扫!

鸿蒙开发:申请授权权限

31浏览 / 0回复

vrn0hn

vrn0hn

0
精华
172
帖子

等  级:Lv.5
经  验:4227
  • Z金豆: 655

    千万礼品等你来兑哦~快点击这里兑换吧~

  • 城  市:
  • 注  册:2024-03-26
  • 登  录:2025-06-12
发表于 2025-06-04 17:38:13
电梯直达 确定
楼主

前言

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

问大家一个问题,向用户进行权限授权,是哪种授权方式呢?显然谜底就在谜面上,采用的是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_GRANTED0表示已授权。

3、向用户申请授权

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

*AUTHOR:AbnerMing    
*INTRODUCE:向用户获取权限授权    
*/   requestPermissionsFromUser(permissions: Array) {     
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager()     
atManager.requestPermissionsFromUser(getContext(), permissions)      
 .then((data) => {         let grantStatus: Array = data.authResults;         
 let length: number = grantStatus.length;         
 for (let i = 0; i < length; i++) {           
 if (grantStatus === 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])     }   }


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

鸿蒙开发:申请授权权限

4、处理授权结果

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

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

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


鸿蒙开发:申请授权权限

相关总结

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


作者:程序员一鸣
来源:稀土掘金


vrn0hn

vrn0hn


精华

帖子

等  级:Lv.5
经  验:4227
发表于 2025-06-05 10:52:56 1楼

您的内容正在火速审核中,请稍等

vrn0hn

vrn0hn


精华

帖子

等  级:Lv.5
经  验:4227
发表于 2025-06-11 11:38:13 2楼

您的内容正在火速审核中,请稍等

高级模式
星空(中国)精选大家都在看24小时热帖7天热帖大家都在问最新回答

针对ZOL星空(中国)您有任何使用问题和建议 您可以 联系星空(中国)管理员查看帮助  或  给我提意见

快捷回复 APP下载 返回列表