HarmonyOS自定義權限組件--你真的弄懂了權限控制了嗎?
前言
關于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.定義權限組,比如:
- //定義需要動態申請的權限組,可以是一個或多個權限。這里的權限還必須要在config.json中進行配置
- private String[] permissions = {
- // 存儲權限
- SystemPermission.WRITE_USER_STORAGE,
- // 相機權限
- SystemPermission.CAMERA
- };
3.在需要觸發權限申請的地方調用如下代碼:
- //開始動態申請權限,鏈式調用。
- //實際開發中申請權限的動作應該放到需要用到該權限的操作中觸發,比如點擊某個按鈕調起相機 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(),"您拒絕了授權");
- }
- }
- });
4.在當前的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模式:
1.引用
方式一: 通過mylibrary模塊生成har包,添加har包到libs文件夾內
方式二:maven引入(待后續上傳到maven中心倉庫再支持)
2、將需要調用的Ability繼承LazyPermissionAblity,如下:
- public class MainAbility extends LazyPermissionAblity {
3、在當前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和LazySample。
mylibrary: 自定義的第三方權限庫,供外部項目調用。
entry: 用來演示mylibrary庫中strong模式下的權限調用。
LazySample: 用來演示mylibrary庫中lazy模式下的權限調用。
文章相關附件可以點擊下面的原文鏈接前往下載
https://harmonyos.51cto.com/resource/1195