...
}
]
}
}
权限申请格式采用数组格式,可支持同时申请多个权限,权限个数最多不能超过1024个。
| 键 | 值说明 | 类型 | 取值范围 | 默认值 | 规则约束 |
| --- | --- | --- | --- | --- | --- |
| name | 必须,填写需要使用的权限名称。 | 字符串 | 自定义 | 无 | 未填写时,解析失败。 |
| reason | 可选,当申请的权限为user\_grant权限时此字段必填。 描述申请权限的原因。 | 字符串 | 显示文字长度不能超过256个字节。 | 空 | user\_grant权限必填,否则不允许在应用市场上架。 需做多语种适配。 |
| usedScene | 可选,当申请的权限为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”字段中自定义所需的权限:
{
“module”: {
“defPermissions”: [
{
“name”: “com.myability.permission.MYPERMISSION”,
“grantMode”: “system_grant”,
“availableScope”: [“signature”]
}, {
…
}
]
}
}
权限定义格式采用数组格式,可支持同时定义多个权限,自定义的权限个数最多不能超过1024个。
defPermissions权限定义字段说明
| 键 | 值说明 | 类型 | 取值范围 | 默认值 | 规则约束 |
| --- | --- | --- | --- | --- | --- |
| name | 必填,权限名称。为最大可能避免重名,采用反向域公司名+应用名+权限名组合。 | 字符串 | 自定义 | 无 | 第三方应用不允许填写系统存在的权限,否则安装失败。未填写解析失败。权限名长度不能超过256个字符。 |
| grantMode | 必填,权限授予方式。 | 字符串 | user\_grant(用户授权)system\_grant(系统授权)取值含义请参见:表3。 | system\_grant | 未填值或填写了取值范围以外的值时,自动赋予默认值; 不允许第三方应用填写user\_grant,填写后会自动赋予默认值。 |
| availableScope | 选填,权限限制范围。不填则表示此权限对所有应用开放。 | 字符串数组 | signatureprivilegedrestricted取值含义请参见:表4。 | 空 | 填写取值范围以外的值时,权限限制范围不生效。 由于第三方应用并不在restricted的范围内,很少会出现权限定义者不能访问自身定义的权限的情况,所以不允许三方应用填写restricted。 |
| label | 选填,权限的简短描述,若未填写,则使用到简短描述的地方由权限名取代。 | 字符串 | 自定义 | 空 | 需要多语种适配。 |
| description | 选填,权限的详细描述,若未填写,则使用到详细描述的地方由label取代。 | 字符串 | 自定义 | 空 | 需要多语种适配。 |
* user\_grant(用户授权)
* system\_grant(系统授权)
取值含义请参见:[表3]( )。 system\_grant 未填值或填写了取值范围以外的值时,自动赋予默认值; 不允许第三方应用填写user\_grant,填写后会自动赋予默认值。 availableScope 选填,权限限制范围。不填则表示此权限对所有应用开放。 字符串数组
* signature
* privileged
* restricted
取值含义请参见:[表4]( )。 空 填写取值范围以外的值时,权限限制范围不生效。 由于第三方应用并不在restricted的范围内,很少会出现权限定义者不能访问自身定义的权限的情况,所以不允许三方应用填写restricted。 label 选填,权限的简短描述,若未填写,则使用到简短描述的地方由权限名取代。 字符串 自定义 空 需要多语种适配。 description 选填,权限的详细描述,若未填写,则使用到详细描述的地方由label取代。 字符串 自定义 空 需要多语种适配。
权限授予方式字段说明
| 授予方式 (grantMode) | 说明 | 自定义权限是否可指定该级别 | 取值样例 |
| --- | --- | --- | --- |
| system\_grant | 在“config.json”里面声明,安装后系统自动授予。 | 是 | GET\_NETWORK\_INFO 、GET\_WIFI\_INFO |
| user\_grant | 在“config.json”里面声明,并在使用时动态申请,用户授权后才可使用。 | 否,如自定义则强制修改为system\_grant。 | CAMERA、MICROPHONE |
权限限制范围字段说明
| 权限范围 (availableScope) | 说明 | 自定义权限是否可指定该级别 | 取值样例 |
| --- | --- | --- | --- |
| restricted | 需要开发者申请对应证书后才能被使用的特殊权限。 | 否 | WRITE\_CONTACTS、READ\_CONTACTS |
| signature | 权限定义方和使用方的签名一致。需在“config.json”里面声明后,由权限管理模块负责签名校验一致后,可使用。 | 是 | 对应用(或Ability)操作的系统接口上由系统定义权限以及应用自定义的权限。 如:发现某Ability,连接某Ability。 |
| privileged | 预置在系统版本中的特权应用可申请的权限。 | 是 | SET\_TIME、MANAGE\_USER\_STORAGE |
##### 访问权限控制
**Ability的访问权限控制**
在config.json中填写“abilities”的“permissions”字段,即只有拥有该权限的应用可访问此Ability。下面的例子表明只有拥有“ohos.permission.CAMERA”权限的应用可以访问此ability。
“abilities”: [
{
“name”: “.MainAbility”,
“description”: “
s
t
r
i
n
g
:
d
e
s
c
r
i
p
t
i
o
n
m
a
i
n
a
b
i
l
i
t
y
"
,
"
i
c
o
n
"
:
"
string:description_main_ability", "icon": "
string:descriptionmainability","icon":"media:hiworld”,
“label”: “HiCamera”,
“launchType”: “standard”,
“orientation”: “portrait”,
“visible”: false,
“permissions”: [
“ohos.permission.CAMERA”
],
}
]
权限保护字段说明
| 键 | 值说明 | 类型 | 取值范围 | 默认值 | 规则约束 |
| --- | --- | --- | --- | --- | --- |
| permissions | 选填,权限名称。用以表示此ability受哪个权限保护,即只有拥有此权限的应用可访问此ability。 | 字符串数组 | 自定义 | 无 | 目前仅支持填写一个权限名,若填写多个权限名,仅第一个权限名称有效。 |
**Ability接口的访问权限控制**
在Ability实现中,如需要对特定接口对调用者做访问控制,可在服务侧的接口实现中,主动通过verifyCallingPermission、verifyCallingOrSelfPermission来检查访问者是否拥有所需要的权限。
if (verifyCallingPermission(“ohos.permission.CAMERA”) != IBundleManager.PERMISSION_GRANTED) {
// 调用者无权限,做错误处理
}
// 调用者权限校验通过,开始提供服务
##### API接口说明
应用权限接口说明
| 接口原型 | 接口详细描述 |
| --- | --- |
| int verifyPermission(String permissionName, int pid, int uid) | 接口功能:查询指定PID、UID的应用是否已被授予某权限 输入参数:permissionName:权限名;pid:进程id;uid:uid 输出参数:无 返回值: IBundleManager.PERMISSION\_DENIED、IBundleManager.PERMISSION\_GRANTED |
| int verifyCallingPermission(String permissionName) | 接口功能:查询IPC跨进程调用方的进程是否已被授予某权限 输入参数:permissionName:权限名 输出参数:无 返回值: IBundleManager.PERMISSION\_DENIED、IBundleManager.PERMISSION\_GRANTED |
| int verifySelfPermission(String permissionName) | 接口功能:查询自身进程是否已被授予某权限 输入参数:permissionName:权限名 输出参数:无 返回值: IBundleManager.PERMISSION\_DENIED、IBundleManager.PERMISSION\_GRANTED |
| int verifyCallingOrSelfPermission(String permissionName) | 接口功能:当有远端调用检查远端是否有权限,否则检查自身是否拥有权限 输入参数:permissionName:权限名 输出参数:无 返回值: IBundleManager.PERMISSION\_DENIED、IBundleManager.PERMISSION\_GRANTED |
| boolean canRequestPermission(String permissionName) | 接口功能:向系统权限管理模块查询某权限是否不再弹框授权了 输入参数:permissionName:权限名 输出参数:无 返回值:true允许弹框,false不允许弹框 |
| void requestPermissionsFromUser (String[] permissions, int requestCode) | 接口功能:向系统权限管理模块申请权限(接口可支持一次申请多个。若下一步操作涉及到多个敏感权限,可以这么用,其他情况建议不要这么用。因为弹框还是按权限组一个个去弹框,耗时比较长。用到哪个权限就去申请哪个) 输入参数: permissions:权限名列表;requestCode: 请求应答会带回此编码以匹配本次申请的权限请求 输出参数:无 返回值:无 |
| void onRequestPermissionsFromUserResult (int requestCode, String[] permissions, int[] grantResults) | 接口功能:调用requestPermissionsFromUser后的应答接口 输入参数:requestCode:requestPermission中传入的requestCode;permissions:申请的权限名;grantResults:申请权限的结果 输出参数:无 返回值:无 |
##### 动态申请权限开发步骤
在config.json文件中声明所需要的权限。
{
“module”: {
“reqPermissions”: [
{
“name”: “ohos.permission.CAMERA”,
“reason”: “$string:permreason_camera”,
“usedScene”: {
“ability”: [“com.mycamera.Ability”, “com.mycamera.AbilityBackground”],
“when”: “always”}
}, {
…
}
]
}
}
使用ohos.app.Context.verifySelfPermission接口查询应用是否已被授予该权限。
* 如果已被授予权限,可以结束权限申请流程。
* 如果未被授予权限,继续执行下一步。
使用canRequestPermission查询是否可动态申请。
* 如果不可动态申请,说明已被用户或系统永久禁止授权,可以结束权限申请流程。
* 如果可动态申请,使用requestPermissionFromUser动态申请权限。
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 {
// 权限已被授予
}
通过重写ohos.aafwk.ability.Ability的回调函数onRequestPermissionsFromUserResult接收授予结果。
@Override
public void onRequestPermissionsFromUserResult (int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_CAMERA: {
// 匹配requestPermissions的requestCode
if (grantResults.length > 0
&& grantResults[0] == IBundleManager.PERMISSION_GRANTED) {
// 权限被授予
// 注意:因时间差导致接口权限检查时有无权限,所以对那些因无权限而抛异常的接口进行异常捕获处理
} else {
// 权限被拒绝
}
return;
}
}
}
#### 应用权限列表
##### 权限分类
HarmonyOS根据接口所涉数据的敏感程度或所涉能力的安全威胁影响,定义了不同开放范围与授权方式的权限来保护数据。
当前权限的开放范围分为:
* all:所有应用可用
* signature:平台签名应用可用
* privileged:预置特权应用可用
* restricted:证书可控应用可用
应用在使用对应服务的能力或数据时,需要申请对应权限。
* 已在config.json文件中声明的非敏感权限,会在应用安装时自动授予,该类权限的授权方式为系统授权(system\_grant)。
* 敏感权限需要应用动态申请,通过运行时发送弹窗的方式请求用户授权,该类权限的授权方式为用户授权(user\_grant)。
当应用调用服务时,服务会对应用进行权限检查,如果没有对应权限则无法使用该服务。
##### 敏感权限
敏感权限的申请需要按照动态申请流程向用户申请授权。
| 权限分类名称 | 权限名 | 说明 |
| --- | --- | --- |
| 位置 | ohos.permission.LOCATION | 允许应用在前台运行时获取位置信息。如果应用在后台运行时也要获取位置信息,则需要同时申请ohos.permission.LOCATION\_IN\_BACKGROUND权限。 |
| ohos.permission.LOCATION\_IN\_BACKGROUND | 允许应用在后台运行时获取位置信息,需要同时申请ohos.permission.LOCATION权限。 |
| 相机 | ohos.permission.CAMERA | 允许应用使用相机拍摄照片和录制视频。 |
| 麦克风 | ohos.permission.MICROPHONE | 允许应用使用麦克风进行录音。 |
| 日历 | ohos.permission.READ\_CALENDAR | 允许应用读取日历信息。 |
| ohos.permission.WRITE\_CALENDAR | 允许应用在设备上添加、移除或修改日历活动。 |
| 健身运动 | ohos.permission.ACTIVITY\_MOTION | 允许应用读取用户当前的运动状态。 |
| 健康 | ohos.permission.READ\_HEALTH\_DATA | 允许应用读取用户的健康数据。 |
| 分布式数据管理 | ohos.permission.DISTRIBUTED\_DATASYNC | 允许不同设备间的数据交换。 |
| ohos.permission.DISTRIBUTED\_DATA | 允许应用使用分布式数据的能力。 |
| 媒体 | ohos.permission.MEDIA\_LOCATION | 允许应用访问用户媒体文件中的地理位置信息。 |
| ohos.permission.READ\_MEDIA | 允许应用读取用户外部存储中的媒体文件信息。 |
| ohos.permission.WRITE\_MEDIA | 允许应用读写用户外部存储中的媒体文件信息。 |
##### 非敏感权限
非敏感权限不涉及用户的敏感数据或危险操作,仅需在config.json中声明,应用安装后即被授权。
| 权限名 | 说明 |
| --- | --- |
| ohos.permission.GET\_NETWORK\_INFO | 允许应用获取数据网络信息。 |
| ohos.permission.GET\_WIFI\_INFO | 允许获取WLAN信息。 |
| ohos.permission.USE\_BLUETOOTH | 允许应用查看蓝牙的配置。 |
| ohos.permission.DISCOVER\_BLUETOOTH | 允许应用配置本地蓝牙,并允许其查找远端设备且与之配对连接。 |
| ohos.permission.SET\_NETWORK\_INFO | 允许应用控制数据网络。 |
| ohos.permission.SET\_WIFI\_INFO | 允许配置WLAN设备。 |
| ohos.permission.SPREAD\_STATUS\_BAR | 允许应用以缩略图方式呈现在状态栏。 |
| ohos.permission.INTERNET | 允许使用网络socket。 |
| ohos.permission.MODIFY\_AUDIO\_SETTINGS | 允许应用程序修改音频设置。 |
| ohos.permission.RECEIVER\_STARTUP\_COMPLETED | 允许应用接收设备启动完成广播。 |
| ohos.permission.RUNNING\_LOCK | 允许申请休眠运行锁,并执行相关操作。 |
| ohos.permission.ACCESS\_BIOMETRIC | 允许应用使用生物识别能力进行身份认证。 |
| ohos.permission.RCV\_NFC\_TRANSACTION\_EVENT | 允许应用接收卡模拟交易事件。 |
| ohos.permission.COMMONEVENT\_STICKY | 允许发布粘性公共事件的权限。 |
| ohos.permission.SYSTEM\_FLOAT\_WINDOW | 提供显示悬浮窗的能力。 |
| ohos.permission.VIBRATE | 允许应用程序使用马达。 |
| ohos.permission.USE\_TRUSTCIRCLE\_MANAGER | 允许调用设备间认证能力。 |
| ohos.permission.USE\_WHOLE\_SCREEN | 允许通知携带一个全屏IntentAgent。 |
| ohos.permission.SET\_WALLPAPER | 允许设置静态壁纸。 |
| ohos.permission.SET\_WALLPAPER\_DIMENSION | 允许设置壁纸尺寸。 |
| ohos.permission.REARRANGE\_MISSIONS | 允许调整任务栈。 |
| ohos.permission.CLEAN\_BACKGROUND\_PROCESSES | 允许根据包名清理相关后台进程。 |
| ohos.permission.KEEP\_BACKGROUND\_RUNNING | 允许Service Ability在后台继续运行。 |
| ohos.permission.GET\_BUNDLE\_INFO | 查询其他应用的信息。 |
| ohos.permission.ACCELEROMETER | 允许应用程序读取加速度传感器的数据。 |
| ohos.permission.GYROSCOPE | 允许应用程序读取陀螺仪传感器的数据。 |
| ohos.permission.MULTIMODAL\_INTERACTIVE | 允许应用订阅语音或手势事件。 |
| ohos.permission.radio.ACCESS\_FM\_AM | 允许用户获取收音机相关服务。 |
| ohos.permission.NFC\_TAG | 允许应用读写Tag卡片。 |
| ohos.permission.NFC\_CARD\_EMULATION | 允许应用实现卡模拟功能。 |
##### 受限开放的权限
受限开放的权限通常是不允许三方应用申请的。如果有特殊场景需要使用,请提供相关申请材料到应用市场申请相应权限证书。如果应用未申请相应的权限证书,却试图在config.json文件中声明此类权限,将会导致应用安装失败。另外,由于此类权限涉及到用户敏感数据或危险操作,当应用申请到权限证书后,还需按照动态申请权限的流程向用户申请授权。
| 权限分类名称 | 典型场景 | 权限名 | 说明 |
| --- | --- | --- | --- |
| 通讯录 | 社交、通讯、备份和恢复用户信息、电话拦截等 | ohos.permission.READ\_CONTACTS | 允许应用读取联系人数据。 |
| 通讯、备份和恢复用户信息等 | ohos.permission.WRITE\_CONTACTS | 允许应用添加、移除和更改联系人数据。 |
---
最后,为了能让大家更好的去学习提升鸿蒙 (Harmony OS) 开发技术,小编连夜整理了一份30个G**纯血版**学习资料(含**视频**、**电子书**、**学习文档**等)以及一份在Github上持续爆火霸榜的《纯血版华为鸿蒙 (Harmony OS)开发手册》(共计890页),希望对大家有所帮助。
## 纯血版鸿蒙 HarmonyOS 4.0 视频学习资料
![](https://img-blog.csdnimg.cn/direct/96278e452e0c4e148a9719152582e3f8.png)
![](https://img-blog.csdnimg.cn/direct/055da709c34041b8b65194f344718ab3.png)
需要以上视频学习资料小伙伴
请点击→[纯血版全套鸿蒙HarmonyOS学习资料]( )
---
## 《纯血版华为鸿蒙 (Harmony OS)开发手册》
这份手册涵盖了当前鸿蒙 (Harmony OS) 开发技术必掌握的核心知识点
#### 纯血版鸿蒙 (Harmony OS)开发手册部分精彩内容
**HarmonyOS 概念:**
* 系统定义
* 技术架构
* 技术特性
* 系统安全
## 写在最后
**在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。**
需要完整版PDF学习资源私我
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**