美文网首页
鸿蒙Harmony 权限申请--动态权限申请

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

作者: 微风_10a5 | 来源:发表于2021-10-12 08:38 被阅读0次

    权限相关开发,在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)的干货。谢谢~~

    相关文章

      网友评论

          本文标题:鸿蒙Harmony 权限申请--动态权限申请

          本文链接:https://www.haomeiwen.com/subject/gthdoltx.html