鸿蒙Harmony 权限申请--动态权限申请

2021-10-12  本文已影响0人  微风_10a5

权限相关开发,在HarmonyOS开发文档里面,是放在安全这一章节,见官方文档,如下图

image-20211012064600488.png

权限申请,分为一般权限申请和动态权限申请,我们下面分别来介绍

一般权限申请

开发者需要在config.json文件中的“reqPermissions”字段中声明所需要的权限。config.json所在位置如下图


image-20211012065409164.png

找到config.json文件,然后在里面增加“reqPermissions”字段;如下图


image-20211012071641144.png

“reqPermissions”字段对应的value值,是一个数组, 里面可以多个对象, 每一个对象描述了一个权限.

动态权限申请

  1. 在config.json文件中声明所需要的权限。

  2. 使用ohos.app.Context.verifySelfPermission接口查询应用是否已被授予该权限。

    • 如果已被授予权限,可以结束权限申请流程。
    • 如果未被授予权限,继续执行下一步。
  3. 使用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 {
    // 权限已被授予
}
  1. 通过重写ohos.aafwk.ability.Ability的回调函数onRequestPermissionsFromUserResult接收授予结果,但这个方法一定要写Ability里面,才能接收授予结果, 如果写在AbilitySlice里面,是收不到结果的
@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;
        }
    }
}

具体来看我们的实例,封装一个方法,在onStart()中调用 一下,

    private void requestPermissions() {
          String[] permissions = {SystemPermission.CAMERA,SystemPermission.LOCATION};
          ArrayList<String> needCheckPermissions = new ArrayList<>();

          for (String permission : permissions) {
              if (verifySelfPermission(permission) != IBundleManager.PERMISSION_GRANTED && canRequestPermission(permission)) {
                  needCheckPermissions.add(permission);
              }

          }

          String[] needPermissions = needCheckPermissions.toArray(new String[0]);
          requestPermissionsFromUser(needPermissions, 100);
    }
image-20211012071149507.png

运行的效果如下:


33.gif

ability里面的代码如下

    @Override
    public void onRequestPermissionsFromUserResult (int requestCode, String[] permissions, int[] grantResults) {


        switch (requestCode) {
            case 100: {
                // 匹配requestPermissions的requestCode
                if (grantResults.length > 0
                        && grantResults[0] == IBundleManager.PERMISSION_GRANTED) {
                    // 权限被授予
                    // 注意:因时间差导致接口权限检查时有无权限,所以对那些因无权限而抛异常的接口进行异常捕获处理
                    Utils.log("权限被授予");
                } else {
                    Utils.log(String.valueOf(grantResults[0]));
                    // 权限被拒绝
                    Utils.log("权限被拒绝");

                }
                return;
            }
        }
    }

结尾

看到这里的小伙们,或者觉得文章对你有点帮助的话,请点赞加关注喽,您的反馈就是我们前进的动力。后续会分享更多关于鸿蒙开发(HarmonyOS)的干货。谢谢~~

上一篇下一篇

猜你喜欢

热点阅读