【HarmonyOS】权限注解框架—PermissionHelper 原创

发布于 2021-8-5 17:20
浏览
3收藏

码云仓库

https://gitee.com/binai/permission-helper

介绍

PermissionHelper提供了一个简单的基于注释的API来处理HarmonyOS Java应用软件运行时所需要的权限。

PermissionHelper框架库减轻了开发者编写一堆检查语句的负担,不管您是否授予了权限,以保持代码的干净整洁。

安装教程

要将PermissionsDispatcher添加到项目中,在需要权限的module的build.gradle文件中的dependencies中添加如下代码即可使用

dependencies {
    ......

    implementation project(':permission')
    implementation project(':permission_annotation')
    annotationProcessor project(':permission_compiler')
}

使用说明

下面以一个简单的ohos.permission.CAMERA相机权限例子简单介绍PermissionHelper框架的使用

1、在config.json文件中添加如下权限代码

   "reqPermissions": [
      {"name": "ohos.permission.CAMERA"}
    ]

2、添加annontations注解

Annotation使用说明如下表所示:

注解/Annotation 必须请求/Required 描述/Description
@CompilePermissions 注解在Ability或者Slice上,标记此类有权限请求操作。
@NeedsSelfPermission 注解在一个需要请求权限(支持添加多个权限)的Java方法上,此方法通过verifySelfPermission(String permission)方法进行检测,确认方式权限授权情况。
@NeedsCallingPermission 注解在一个需要请求权限(支持添加多个权限)的Java方法上,此方法通过verifyCallingPermission(String permission)方法进行检测,确认方式权限授权情况。
@NeedsCallingOrSelfPermission 注解在一个需要请求权限(支持添加多个权限)的Java方法上,此方法通过verifyCallingOrSelfPermission(String permission)方法进行检测,确认方式权限授权情况。
@OnPermissionBlocked 注解在一个方法上,在权限请求失败,或者权限被拒绝授权时回调此方法
@CompilePermissions
public class MainAbilitySlice extends AbilitySlice {

    @NeedsSelfPermission("ohos.permission.CAMERA")
    public void selfCameraPermission() {
        new ToastDialog(getAbility()).setText("self permission success.").show();
    }

    @NeedsCallingPermission("ohos.permission.CAMERA")
    public void callingCameraPermission() {
        new ToastDialog(getAbility()).setText("calling permission success.").show();
    }

    @NeedsCallingOrSelfPermission("ohos.permission.CAMERA")
    public void callingOrSelfCameraPermission() {
        new ToastDialog(getAbility()).setText("calling or self permission success.").show();
    }

    @OnPermissionBlocked("ohos.permission.CAMERA")
    public void onNeverAskAgain() {
        new ToastDialog(getAbility()).setText("request permission fail.").show();
    }

}

3、调用委托类的方法

^注意:编译后,PermissionHelper会在@CompilePermissions注解的类的包名下自动生成一个委托类(Ability Name/Slice Name + PermissionHelper),类名为MainAbilitySlicePermissionHelper

@CompilePermissions注解的类中通过委托类启动权限请求

@CompilePermissions
public class MainAbilitySlice extends AbilitySlice {

    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);

        findComponentById(ResourceTable.Id_text_helloworld).setClickedListener((Component component) -> {
            MainAbilitySlicePermissionHelper.selfCameraPermission(this);
        });

    }

    @NeedsSelfPermission("ohos.permission.CAMERA")
    public void selfCameraPermission() {
        new ToastDialog(getAbility()).setText("self permission success.").show();
    }
    
    ......
    
}

在Slice吸附的Ability中的onRequestPermissionsFromUserResult(int requestCode, String[] permissions, int[] grantResults)权限回调方法中调用委托类的相应onRequestPermissionsFromUserResult(int requestCode, String[] permissions, int[] grantResults)方法处理权限回调请求

public class MainAbility extends Ability {

    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setMainRoute(MainAbilitySlice.class.getName());
    }

    @Override
    public void onRequestPermissionsFromUserResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsFromUserResult(requestCode, permissions, grantResults);
        MainAbilitySlicePermissionHelper.onRequestPermissionsFromUserResult(requestCode, permissions, grantResults);
    }
}

FQA

如果在使用PermissionHelper时,发现DevEco Studio无法识别/找不到委托类(Ability Name/Slice Name + PermissionHelper),可以先执行Build—>Build APP(s)/Hap(s)—>Build Debug Hap(s);

如果Build构建之后还是无法识别/找不到委托类(Ability Name/Slice Name + PermissionHelper),可以选中module下的build目录下面build/generated/source/annotation/debug/目录,鼠标右击执行Mark Directory as —>Generated Sources Root修复问题。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2021-9-10 08:52:06修改
2
收藏 3
回复
举报
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
    相关推荐