鸿蒙APP开发:权限控制详解!

白马非马 2021-09-15 13:50:22 5197

关于 HarmonyOS 的动态授权的常规操作流程和代码我之前写过一篇文章:《鸿蒙动态权限申请完整规范流程和操作详解》。

文章地址如下:
https://harmonyos.51cto.com/posts/5165

权限控制是在进行 HarmonyOS 应用开发中非常重要的一个环节,几乎所有的商业应用中都会涉及到。

我们在曾经使用的 Android app 应用中经常会遇到一些 app 会弹出各种敏感权限授权窗口提示用户授权。

有些 app(特别是流氓应用)经常会在第一次打开 app 的时候就提醒用户授予所有需要的权限。

甚至一些权限跟 app 功能根本不相关(比如读取通讯录等),如果不授权则直接不让你使用该 app,我遇到这类流氓应用一般果断卸载。

而真正的开发过程中我们在权限申请的时候一般要遵循以下 3 个原则:

最小权限集,即应用中确实需要的权限才进行申请。

需要用到 XX 权限时才进行申请,即并不是 app 开始的时候一次性申请所有权限,而是需要用到 XX 特定功能必须要授权才能使用的时候(比如调用照相机),这个时候才申请该特定权限。

未获取用户授权的话依然能使用应用大部分功能,只是必须授权的功能无法使用。

下面我针对敏感权限申请更好的复用,编写了一个第三方开源组件,取名为 XdwPermissionsLib。

具体项目源码请见:
https://gitee.com/xdw1019/XdwPermissionsLib

XdwPermissionsLib 介绍

鸿蒙权限请求框架,提供一个符合正规权限调用流程的框架并基于链式调用(这里简称 strong 模式),同时提供一个并不推荐使用的简单权限框架(简称 lazy 模式)。

strong 模式:正式项目推荐使用该模式。正规权限处理流程,用户需要检验权限并且处理校验结果的回调。

lazy 模式:该模式下开发者几乎不用去编写请求权限的代码,特别是不处理回调。

该模式不推荐在正式项目中使用,可以用于平时编写某些 demo 又不想处理权限的场景下。

当然有些 app 不在乎用户体验,只要不授权就不让使用的情况可以使用该模式。

动态申请权限流程图如下:

使用说明

①Strong 模式

引用:

方式一:通过 mylibrary 模块生成 har 包,添加 har 包到 libs 文件夹内

方式二:maven 引入(待后续上传到 maven 中心仓库再支持)

定义权限组,比如:
//定义需要动态申请的权限组,可以是一个或多个权限。这里的权限还必须要在config.json中进行配置
private String[] permissions = {
// 存储权限
SystemPermission.WRITE_USER_STORAGE,
// 相机权限
SystemPermission.CAMERA
};

在需要触发权限申请的地方调用如下代码:

//开始动态申请权限,链式调用。
//实际开发中申请权限的动作应该放到需要用到该权限的操作中触发,比如点击某个按钮调起相机 StrongPermissionsUtils.getInstance(this).checkPermissions(this,permissions).setPermissionStateListener(new StrongPermissionsUtils.PermissionStateListener() {
@Override
public void onPermissionGranted() {
//授权成功之后的回调
//此处根据自己的实际业务编写业务逻辑,此处用toast进行演示
ToastUtil.toast(getContext(),"授权成功");
}

        @Override
        public void onPermissionDenied(boolean isDisabledPrompt) {
            //授权拒绝之后的回调
            //此处根据自己的实际业务编写业务逻辑,此处用toast进行演示
            if(isDisabledPrompt){
                ToastUtil.toast(getContext(),"您之前拒绝了授权并且禁止系统再提示,需要手动进入系统设置页面开启");
            }else{
                ToastUtil.toast(getContext(),"您拒绝了授权");
            }
        }
    });

在当前的 ability 重写 onRequestPermissionsFromUserResult 方法,代码如下:

@Override
public void onRequestPermissionsFromUserResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsFromUserResult(requestCode, permissions, grantResults);
//鉴权之后的回调,必须调用
StrongPermissionsUtils.getInstance(this).onRequestPermissionsResult(requestCode, permissions, grantResults);
}

②Lazy 模式

引用:
方式一:通过 mylibrary 模块生成 har 包,添加 har 包到 libs 文件夹内

方式二:maven 引入(待后续上传到 maven 中心仓库再支持)

将需要调用的 Ability 继承 LazyPermissionAblity,如下:

public class MainAbility extends LazyPermissionAblity {

在当前 Ability 中定义权限组,并且在 onStart 方法的第一行调用 setPermissions 方法。

代码如下:

public class MainAbility extends LazyPermissionAblity {
//定义需要动态申请的权限组,可以是一个或多个权限。这里的权限还必须要在config.json中进行配置
private String[] permissions = {
// 存储权限
SystemPermission.WRITE_USER_STORAGE,
// 相机权限
SystemPermission.CAMERA
};
@Override
public void onStart(Intent intent) {
//lazy模式下,setPermissions的代码调用必须放在onStart的第一行
super.setPermissions(permissions);
super.onStart(intent);
super.setMainRoute(MainAbilitySlice.class.getName());
}
}

工程结构说明

工程中总共有三个 module,分别为:
mylibrary:自定义的第三方权限库,供外部项目调用。

entry:用来演示 mylibrary 库中 strong 模式下的权限调用。

LazySample:用来演示 mylibrary 库中 lazy 模式下的权限调用。

来源:鸿蒙技术社区

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 93 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
白马非马
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区