前提
本章节使用Java进行开发,使用API version 6进行权限开发。
权限申请的必要性
一个应用可能提供了多种功能,其中应用为满足用户的关键需求而提供的功能,称为应用的核心功能。这是一个相对宽泛的概念,本规范用来辅助描述用户权限授权的预期。用户选择安装一个应用,通常是被应用的核心功能所吸引。比如导航类应用,定位导航就是这种应用的核心功能;比如媒体类应用,播放以及媒体资源管理就是核心功能,这些功能所需要的权限,用户在安装时内心已经倾向于授予(否则就不会去安装)。与核心功能相对应的是辅助功能,这些功能所需要的权限,需要向用户清晰说明目的、场景等信息,由用户授权。所以进行权限申请是十分必要的,某些权限是核心功能能否实现的关键。
权限声明
- 应用需要在config.json中使用“reqPermissions”属性对需要的权限逐个进行声明。
- 若使用到的三方库也涉及权限使用,也需统一在应用的config.json中逐个声明。
- 没有在config.json中声明的权限,应用就无法获得此权限的授权。
点击config.json文件,在model模块下增加reqPermissions
。如下所示:
{
"module": {
"reqPermissions": [
{
"name": "ohos.permission.CAMERA",
"reason": "$string:permreason_camera",
"usedScene":
{
"ability": ["com.mycamera.Ability", "com.mycamera.AbilityBackground"],
"when": "always"
}
},{
}
]
}
}
根据上面config.json
,看到在配置文件中声明权限的方法。解释reqPermissions
中属性
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。 |
申请权限
根据官方文档中提供的api[,](权限开发指导-权限-安全-基于Java开发-开发-HarmonyOS应用开发具体API可以进入文档中进行查阅。
向用户申请权限的api是requestPermissionsFromUser
其有两个参数,一个是String[]类型的权限名称,一个是requestCode: 请求应答会带回此编码以匹配本次申请的权限请求。下面代码是向用户请求权限,
private void requestPermission() {
requestPermissionsFromUser(new String[]{"ohos.permission.CAMERA"},1);//向用户申请相对应权限
}
//在生命周期开始时候向用户申请
```
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
requestPermission();
}
效果实现
申请权限代码优化
private void requestPermission() {
String[] permission = {
//添加所需权限
};
List<String> applyPermissions = new ArrayList<>();//收集需要权限的数组
for (String element : permission) {
//判断自身是否赋予了该项权限
if (verifySelfPermission(element) != 0) {
//向系统权限管理模块查询某权限是否不再弹框授权了
if (canRequestPermission(element)) {
applyPermissions.add(element);
}
}
}
//向用户申请权限数组中权限
requestPermissionsFromUser(applyPermissions.toArray(new String[0]), 0);
}
上述代码可以优化向用户申请权限步骤,可以让已经申请权限不再重复进行申请。
小结
本章节介绍如何在鸿蒙进行权限开发的基础知识与具体步骤。