# PermissionsDispatcher **Repository Path**: HarmonyOS-tpc/PermissionsDispatcher ## Basic Information - **Project Name**: PermissionsDispatcher - **Description**: PermissionsDispatcher提供了一个简单的基于注释的API来处理运行时权限 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 8 - **Forks**: 2 - **Created**: 2021-04-01 - **Last Updated**: 2025-05-05 ## Categories & Tags **Categories**: harmony **Tags**: None ## README # PermissionsDispatcher PermissionsDispatcher提供了一个简单的基于注释的API来处理运行时权限。该库减轻了编写一堆检查语句(无论是否已授予您权限)带来的负担,以保持您的代码干净安全。 ## Usage 内部有一个简单的simple可供参考 ## entry运行要求 通过DevEco studio,并下载SDK 将项目中的build.gradle文件中dependencies→classpath版本改为对应的版本(即你的IDE新建项目中所用的版本) ### 0. 通过DevEco studio 2.0+,并下载SDK Native 版本2.0+ "在中文路径下,Build Debug Hap(s)会失败,请将项目放置在全英文目录下" 在entry的gradle中集成如下操作: 如果使用har,请将har放到entry中的libs 修改implementation fileTree(dir: 'libs', include: ['*.jar','*.har'])增加*.har 准备 config.json和build.gradle 添加对应的权限到config.json中 ``` "reqPermissions": [ { "name": "ohos.permission.CAMERA" } ] 在entry的build.gradle中添加。 compileOptions{ annotationEnabled true } ``` ``` allprojects{ repositories{ mavenCentral() } } implementation 'io.openharmony.tpc.thirdlib:permissionsdispatcher-library:1.0.4' implementation 'io.openharmony.tpc.thirdlib:permissionsdispatcher-processor:1.0.4' annotationProcessor 'io.openharmony.tpc.thirdlib:permissionsdispatcher-processor:1.0.4' ``` ### 1. 注解 PermissionsDispatcher仅引入一些注释,以保持其常规API的简洁性: > 注意:带注释的方法不能为private. |Annotation|Required|Description| |---|---|---| |`@RuntimePermissions`|**✓**|注册ability或slice处理权限| |`@NeedsPermission`|**✓**|注解执行需要一个或多个权限操作| |`@OnShowRationale`||注解一种解释为什么需要权限的方法。它传入一个PermissionRequest对象,该对象可用于在用户输入时继续或中止当前的权限请求。如果不为该方法指定任何参数,则编译器将生成proceed()和cancel()。您可以使用这些方法代替permissionRequest. proceed()申请权限。permissionRequest. cancel ()取消申请权限。可写一个dialog供选择| |`@OnPermissionDenied`||注解如果用户未授予权限则调用的方法| |`@OnNeverAskAgain`||注解一个方法,如果用户选择让设备“不再询问”权限,则调用该方法| ```java @NeedsPermission(CAMERA_PERMISSION_NAME) public void toOpenPermission() { ToastUtil("权限已申请成功"); } @OnPermissionDenied(CAMERA_PERMISSION_NAME) public void toResetPermission() { ToastUtil("OnPermissionDenied权限被拒绝了"); } @OnShowRationale(CAMERA_PERMISSION_NAME) public void showDialog(PermissionRequest request) { ToastUtil("showDialog解释你需要你打开相应权限原因,需要写dialog弹框选择"); //确定申请 request.proceed(); //取消 // request.cancel(); } @OnNeverAskAgain(CAMERA_PERMISSION_NAME) public void toExplainPermission() { ToastUtil("OnNeverAskAgain解释这个权限为什么被拒绝"); } ``` ### 2. 委托给生成的函数 生成对应的class后,调用class中方法即可开始执行申请权限 ```java @Override public void onStart(Intent intent) { super.onStart(intent); super.setUIContent(ResourceTable.Layout_ability_main); Button buttonStart = (Button) findComponentById(ResourceTable.Id_btn_main_apply); buttonStart.setClickedListener(new Component.ClickedListener() { @Override public void onClick(Component component) { //studio原因报红,但是也是能正常运行的不要慌,在对应entry->build->generated->sources文件夹上右键选择Mark Directory as ->选择 Generated Source Root。 MainAbilityPermissionsDispatcher.toOpenPermissionWithPermissionCheck(MainAbility.this); } }); } 回调方法 @Override public void onRequestPermissionsFromUserResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsFromUserResult(requestCode, permissions, grantResults); MainAbilityPermissionsDispatcher.onRequestPermissionsFromUserResult(this,requestCode,grantResults); } ``` ## Issues 1,由于studio暂时无法解决问题,build后暂时无法找到生成文件需要如下操作。 将项目build一下后,然后在entry->build->generated->sources->annotationProcessor->java->main->与包名相同的文件夹,build后自动生成文件,由于studio原因,无法直接引用到该文件下面生成对应与ability/slice对应xxPermissionDispatcher的方法,需要进行如下操作。 在对应entry->build->generated->sources文件夹上右键选择Mark Directory as ->选择 Generated Source Root。然后在ability或slice中就可以引用了。 2,由于slice中无onRequestPermissionsFromUserResult(xxx)方法导致无回调信息判断权限是否已经成功,会导致权限申请成功或被禁止后,@NeedsPermission,@OnNeverAskAgain被注解后的方法当时无法被调用。 ## License ``` Copyright 2020 Shintaro Katafuchi, Marcel Schnelle, Yoshinori Isogai Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ```