场景介绍
HarmonyOS 支持开发者自定义权限来保护能力或接口,同时开发者也可申请权限来访问受权限保护的对象。
权限申请
开发者需要在 config.json 文件中的“reqPermissions”字段中声明所需要的权限。
{"reqPermissions": [{"name": "ohos.permission.CAMERA","reason": "$string:permreason_camera","usedScene": {"ability": ["com.mycamera.Ability", "com.mycamera.AbilityBackground"],"when": "always"}},{...}]}
权限申请格式采用数组格式,可支持同时申请多个权限,权限个数最多不能超过 1024 个。
键 | 值说明 | 类型 | 取值范围 | 默认值 | 规则约束 |
---|---|---|---|---|---|
必须,填写需要使用的权限名称。 | 字符串 | 自定义 | 无 | 未填写时,解析失败。 | |
可选,当申请的权限为user_grant权限时此字段必填。描述申请权限的原因。 | 字符串 | 显示文字长度不能超过256个字节。 | 空 | user_grant权限必填,否则不允许在应用市场上架。需做多语种适配。 | |
可选,当申请的权限为user_grant权限时此字段必填。描述权限使用的场景和时机。场景类型有:ability、when(调用时机)。可配置多个ability。 | ability:字符串数组when:字符串 | ability:ability的名称when:inuse(使用时)、always(始终) | ability:空when:inuse | user_grant权限必填ability,可选填when。 |
如果声明使用的权限的 grantMode 是 system_grant, 则权限会在当应用安装的时候被自动授予。
如果声明使用的权限的 grantMode 是 user_grant,则必须经用户手动授权(用户在弹框中授权或进入权限设置界面授权)才可使用。用户会看到 reason 字段中填写的理由,来帮助用户决定是否给予授权。
说明
对于授权方式为 user_grant 的权限,每一次执行需要这一权限的操作时,都需要检查自身是否有该权限。当自身具有权限时,才可继续执行,否则应用需要请求用户授予权限。示例参见[动态申请权限开发步骤]。

自定义权限
开发者需要在 config.json 文件中的“defPermissions”字段中自定义所需的权限:
{"defPermissions": [{"name": "com.myability.permission.MYPERMISSION","grantMode": "system_grant","availableScope": ["signature"]}, {...}]}
权限定义格式采用数组格式,可支持同时定义多个权限,自定义的权限个数最多不能超过 1024个。权限定义的字段描述详见[表2]。
键 | 值说明 | 类型 | 取值范围 | 默认值 | 规则约束 |
---|---|---|---|---|---|
必填,权限名称。为最大可能避免重名,采用反向域公司名+应用名+权限名组合。 | 字符串 | 自定义 | 无 | 第三方应用不允许填写系统存在的权限,否则安装失败。未填写解析失败。权限名长度不能超过256个字符。 | |
必填,权限授予方式。 | 字符串 | user_grant(用户授权)system_grant(系统授权)取值含义参见:[表3]。 | system_grant | 未填值或填写了取值范围以外的值时,自动赋予默认值;不允许第三方应用填写user_grant,填写后会自动赋予默认值。 | |
availableScope | 选填,权限限制范围。不填则表示此权限对所有应用开放。 | 字符串数组 | signatureprivilegedrestricted可参见。取值含义请见:[表4]。 | 空 | 填写取值范围以外的值时,权限限制范围不生效。由于第三方应用并不在restricted的范围内,很少会出现权限定义者不能访问自身定义的权限的情况,所以不允许三方应用填写restricted。 |
选填,权限的简短描述,若未填写,则使用到简短描述的地方由权限名取代。 | 字符串 | 自定义 | 空 | 需要多语种适配。 | |
description | 选填,权限的详细描述,若未填写,则使用到详细描述的地方由label取代。 | 字符串 | 自定义 | 空 | 需要多语种适配。 |
授予方式(grantMode) | 说明 | 自定义权限是否可指定该级别 | 取值样例 |
---|---|---|---|
system_grant | 在“config.json”里面声明,安装后系统自动授予。 | 是 | GET_NETWORK_INFO、GET_WIFI_INFO |
user_grant | 在“config.json”里面声明,并在使用时动态申请,用户授权后才可使用。 | 否,如自定义则强制修改为system_grant。 | CAMERA、MICROPHONE |
权限范围(availableScope) | 说明 | 自定义权限是否可指定该级别 | 取值样例 |
---|---|---|---|
restricted | 需要开发者向华为申请后才能被使用的特殊权限。 | 否 | ANSWER_CALL、READ_CALL_LOG、RECEIVE_SMS |
权限定义方和使用方的签名一致。需在“config.json”里面声明后,由权限管理模块负责签名校验一致后,可使用。 | 是 | 对应用(或Ability)操作的系统接口上由系统定义权限以及应用自定义的权限。如:find某Ability,连接某Ability。 | |
privileged | 预置在系统版本中的特权应用可申请的权限。 | 是 | SET_TIME、MANAGE_USER_STORAGE |
访问权限控制
在 config.json 中填写“abilities”到“permissions”字段,即只有拥有该权限的应用可访问此Ability。下面的例子表明只有拥有“ohos.permission.CAMERA”权限的应用可以访问此ability。
"abilities": [{"name": ".MainAbility","description": "$string:description_main_ability","icon": "$media:hiworld.png","label": "HiCamera","launchType": "standard","orientation": "portrait","visible": false,"permissions": ["ohos.permission.CAMERA"],}]
键 | 值说明 | 类型 | 取值范围 | 默认值 | 规则约束 |
---|---|---|---|---|---|
permissions | 选填,权限名称。用以表示此ability受哪个权限保护,即只有拥有此权限的应用可访问此ability。 | 字符串 | 自定义 | 无 | 目前仅支持填写一个权限名,若填写多个权限名,仅第一个权限名称有效。 |
在 Ability 实现中,如需要对特定接口对调用者做访问控制,可在服务侧的接口实现中,主动通过 verifyCallingPermission、 verifyCallingOrSelfPermission 来检查访问者是否拥有所需要的权限。
if (verifyCallingPermission("ohos.permission.CAMERA") != IBundleManager.PERMISSION_GRANTED) {// 调用者无权限,做错误处理}// 调用者权限校验通过,开始提供服务
api接口说明
接口原型 | 接口详细描述 |
---|---|
publiCIntverifyPermission(StringpermissionName,intpid,intuid) | 接口功能:查询指定PID、UID的应用是否已被授予某权限输入参数:permissionName:权限名;pid:进程id;uid:uid输出参数:无返回值:IBundleManager.PERMISSION_DENIED、IBundleManager.PERMISSION_GRANTED |
publicintverifyCallingPermission(StringpermissionName) | 接口功能:查询IPC跨进程调用方的进程是否已被授予某权限输入参数:permissionName:权限名输出参数:无返回值:IBundleManager.PERMISSION_DENIED、IBundleManager.PERMISSION_GRANTED |
publicintverifySelfPermission(StringpermissionName) | 接口功能:查询自身进程是否已被授予某权限输入参数:permissionName:权限名输出参数:无返回值:IBundleManager.PERMISSION_DENIED、IBundleManager.PERMISSION_GRANTED |
publicintverifyCallingOrSelfPermission(StringpermissionName) | 接口功能:当有远端调用检查远端是否有权限,否则检查自身是否拥有权限输入参数:permissionName:权限名输出参数:无返回值:IBundleManager.PERMISSION_DENIED、IBundleManager.PERMISSION_GRANTED |
publicbooleancanRequestPermission(StringpermissionName) | 接口功能:向系统权限管理模块查询某权限是否不再弹框授权了输入参数:permissionName:权限名输出参数:无返回值:true允许弹框,false不允许弹框 |
voidrequestPermissionsFromUser(String[]permissions,intrequestCode) | 接口功能:向系统权限管理模块申请权限(接口可支持一次申请多个。若下一步操作涉及到多个敏感权限,可以这么用,其他情况建议不要这么用。因为弹框还是按权限组一个个去弹框,耗时比较长。用到哪个权限就去申请哪个)输入参数:permissionNames:权限名列表;requestCode:请求应答会带回此编码以匹配本次申请的权限请求输出参数:无返回值:无 |
voidonRequestPermissionsFromUserResult(intrequestCode,String[]permissions,int[]grantResults) | 接口功能:调用requestPermissionsFromUser后的应答接口输入参数:requestCode:requestPermission中传入的requestCode;permissions:申请的权限名;grantResults:申请权限的结果输出参数:无返回值:无 |
动态申请权限开发步骤
{" reqPermissions": [{"name": "ohos.permission.CAMERA","reason": "$string:permreason_camera","usedScene": {"ability": ["com.mycamera.Ability", "com.mycamera.AbilityBackground"],"when": "always"}}, {...}]}]}
样例代码如下:
if (verifySelfPermission("ohos.permission.CAMERA") != IBundleManager.PERMISSION_GRANTED) {// 应用未被授予权限if (canRequestPermission("ohos.permission.CAMERA")) {// 是否可以申请弹框授权(首次申请或者用户未选择禁止且不再提示)requestPermissionsFromUser(new String[] { "ohos.permission.CAMERA" } , MY_PERMISSIONS_REQUEST_CAMERA);} else {// 显示应用需要权限的理由,提示用户进入设置授权}} else {// 权限已被授予}@overridepublic void onRequestPermissionsFromUserResult (int requestCode, String[] permissions, int[] grantResults){switch (requestCode) {case MY_PERMISSIONS_REQUEST_CAMERA: {// 匹配requestPermissions的requestCodeif (grantResults.length > 0&& grantResults[0] == IBundleManager.PERMISSION_GRANTED) {// 权限被授予// 注意:因时间差导致接口权限检查时有无权限,所以对那些因无权限而抛异常的接口进行异常捕获处理} else {// 权限被拒绝}return;}}}
盗版软件如何处理呢?
1.首先重启你的计算机,进入安全模式,登陆管理员帐号--保证你拥有进入windows\system32以及Windows\system32\dllcache路径的权限。 在这两个路径下均有一个名为的文件。 你必须将两个路径下的均删除--这将阻止Windows在启动时弹出“盗版XP”气球。 2.进入注册表,进入HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ Windows NT\CurrentVersion\Winlogon\Notify删除其中的“WGALOGON”文件夹--这将Windows将无法加载任何有关WGA的DLL文件。 3.重新启动,就不会自动启动了,再把x:\windows\system32中的删除,再搜索一下,在另外的文件夹下还有,统统删除,这样就ok了。 还有要记得以后不要再更新这个补丁了。
Win10系统桌面一直在刷新怎么办
截图中提到错误模块和路径遇到这种情况,可以到正常的电脑中2113搜索这个动态链文件,看同版本的操作系统中是否有此文件?没有,就可以根据路径找到这个惹是生非的文件,将其删5261除即可。 使用Windows+E快捷键,调出资源管理器→点开此电脑。 点击打4102开Windows10操作系统所在的磁盘(通常是C盘)。 用户文件夹就是1653路径中的Users文件夹(英文名称)。 再打开当前的用户名(截图中是Dell)可能会有权限问题,点击继续。 稍后打开,可能看不到系统隐藏文件,需要设置回一下,点击查看。 勾选隐藏的项目。 这时就会有AppData系统文件夹了,按照路径找到答文件,删除,重启电脑即可。
锐起无盘XP系统怎么将游戏共享
用高级用户去升级服务器内的游戏,然后将客户机从启,然后就能看到新的游戏了!在服务器上是无法更新游戏的,因为锐起为了防病毒安全,在安装服务器端映射的盘符里的文件都转换成镜像文件包了!添加新游戏的话,可以找台客户机,把游戏下载好,用高级用户的模式进入,然后把游戏安装到服务器的盘符内就可以了!如果有个别游戏需要注册表文件的话,还需要导出游戏的注册表,并做个批处理文件放在服务器内!这样客户机就都能看到新增的游戏了。游戏更新是一样的拉,就是用高级用户身份进入服务器,直接升级游戏就可以了!如果客户机得不到最高版本的话,从启下就可以了!这个高级用户的权限是所有权限,可以更改里面的文件和配置,普通用户只有读取的权限,没有修改的权限,不过在普通用户下会给个临时的缓存空间,表面上就可以更改,但是,从启后发现还是回到原来的状态!
发表评论