鸿蒙开发学习3-权限开发指南

131 阅读3分钟

前提

本章节使用Java进行开发,使用API version 6进行权限开发。

权限申请的必要性

一个应用可能提供了多种功能,其中应用为满足用户的关键需求而提供的功能,称为应用的核心功能。这是一个相对宽泛的概念,本规范用来辅助描述用户权限授权的预期。用户选择安装一个应用,通常是被应用的核心功能所吸引。比如导航类应用,定位导航就是这种应用的核心功能;比如媒体类应用,播放以及媒体资源管理就是核心功能,这些功能所需要的权限,用户在安装时内心已经倾向于授予(否则就不会去安装)。与核心功能相对应的是辅助功能,这些功能所需要的权限,需要向用户清晰说明目的、场景等信息,由用户授权。所以进行权限申请是十分必要的,某些权限是核心功能能否实现的关键。

权限声明

  • 应用需要在config.json中使用“reqPermissions”属性对需要的权限逐个进行声明。
  • 若使用到的三方库也涉及权限使用,也需统一在应用的config.json中逐个声明。
  • 没有在config.json中声明的权限,应用就无法获得此权限的授权。

image.png

点击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:inuseuser_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();
}

效果实现

image.png

申请权限代码优化

 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);
    }

上述代码可以优化向用户申请权限步骤,可以让已经申请权限不再重复进行申请。

小结

本章节介绍如何在鸿蒙进行权限开发的基础知识与具体步骤。