HarmonyOS自定义权限组件--你真的弄懂了权限控制了吗?

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

[[424081]]

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

前言

关于HarmonyOS的动态授权的常规操作流程和代码我之前写过一篇文章,请看《鸿蒙动态权限申请完整规范流程和操作详解(https://harmonyos.51cto.com/posts/5165)》。

权限控制是在进行HarmonyOS应用开发中非常重要的一个环节,几乎所有的商业应用中都会涉及到。我们在曾经使用的Android app应用中经常会遇到一些app会弹出各种敏感权限授权窗口提示用户授权,有些app(特别是流氓应用)经常会在第一次打开app的时候就提醒用户授予所有需要的权限,甚至一些权限跟app功能根本不相关(比如读取通讯录等),如果不授权则直接不让你使用该app,我遇到这类流氓应用一般果断卸载。而真正的开发过程中我们在权限申请的时候一般要遵循以下3个原则:

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

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

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

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

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

XdwPermissionsLib

介绍

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

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

lazy模式:该模式下开发者几乎不用去编写请求权限的代码,特别是不处理回调。该模式不推荐在正式项目中使用,可以用于平时编写某些demo又不想处理权限的场景下。当然有些app不在乎用户体验,只要不授权就不让使用的情况可以使用该模式。

动态申请权限流程图

运行效果图展示:

Strong模式下的效果图:

图片待补充

lazy模式下的效果图:

图片待补充

使用说明

Strong模式:

1.引用

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

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

2.定义权限组,比如:

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

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

  1. //开始动态申请权限,链式调用。 
  2. //实际开发中申请权限的动作应该放到需要用到该权限的操作中触发,比如点击某个按钮调起相机    StrongPermissionsUtils.getInstance(this).checkPermissions(this,permissions).setPermissionStateListener(new StrongPermissionsUtils.PermissionStateListener() { 
  3.             @Override 
  4.             public void onPermissionGranted() { 
  5.                 //授权成功之后的回调 
  6.                 //此处根据自己的实际业务编写业务逻辑,此处用toast进行演示 
  7.                 ToastUtil.toast(getContext(),"授权成功"); 
  8.             } 
  9.  
  10.             @Override 
  11.             public void onPermissionDenied(boolean isDisabledPrompt) { 
  12.                 //授权拒绝之后的回调 
  13.                 //此处根据自己的实际业务编写业务逻辑,此处用toast进行演示 
  14.                 if(isDisabledPrompt){ 
  15.                     ToastUtil.toast(getContext(),"您之前拒绝了授权并且禁止系统再提示,需要手动进入系统设置页面开启"); 
  16.                 }else
  17.                     ToastUtil.toast(getContext(),"您拒绝了授权"); 
  18.                 } 
  19.             } 
  20.         }); 

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

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

Lazy模式:

1.引用

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

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

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

  1. public class MainAbility extends LazyPermissionAblity { 

3、在当前Ability中定义权限组,并且在onStart方法的第一行调用setPermissions方法,如下:

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

工程结构说明

工程中总共有三个module,分别为mylibrary、entry和LazySample。

mylibrary: 自定义的第三方权限库,供外部项目调用。

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

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

文章相关附件可以点击下面的原文链接前往下载

https://harmonyos.51cto.com/resource/1195

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2018-10-20 16:05:12

iOSAPP开发

2022-07-27 08:01:29

CMS垃圾回收器

2022-04-07 08:20:22

typeinterface前端

2022-03-08 15:01:48

负载均衡IP服务器

2022-02-17 07:10:39

Nest自定义注解

2022-04-24 15:17:56

鸿蒙操作系统

2022-05-06 09:21:21

TypeScriptinterfacetype

2018-01-05 10:47:59

前端JavascriptWeb

2022-06-27 08:16:34

JSON格式序列化

2017-02-14 12:34:28

iOSAllocInit

2023-02-20 15:20:43

启动页组件鸿蒙

2021-11-01 10:21:36

鸿蒙HarmonyOS应用

2021-03-09 15:23:45

鸿蒙HarmonyOS应用开发

2022-07-04 10:39:24

TienChin项目自定义

2022-02-21 15:16:30

HarmonyOS鸿蒙操作系统

2022-06-20 15:43:45

switch开关鸿蒙

2021-12-21 15:22:22

鸿蒙HarmonyOS应用

2022-06-30 14:02:07

鸿蒙开发消息弹窗组件

2022-07-15 16:45:35

slider滑块组件鸿蒙

2021-09-15 10:19:15

鸿蒙HarmonyOS应用
点赞
收藏

51CTO技术栈公众号