Android 注解实现权限管理 APP不再对onRequestPermissionsResult进行操作
来源:互联网 发布:数据修炼系统顶点 编辑:程序博客网 时间:2024/06/02 04:50
1 . 描述
一直以来很烦躁6.0权限管理,特别是一个页面有多个权限的时候,因为每一次不但要包裹method还要在onRequestPermissionsResult方法里面进行不同类型的不同操作,就想能不能再简化一点进行操作
2 . 工具类
于是想到用注解的形式,让onRequestPermissionsResult里面的代码自动运行到我包裹的method里面
public class PermissionUtils { @Target(ElementType.METHOD)//注解的作用域 @Retention(RetentionPolicy.RUNTIME)//注解的有效时 public @interface PermissionHelper { boolean permissionResult(); int requestCode(); } public static void injectActivity(Activity activity, boolean permissionResult, int requestCode) { Class clazz = activity.getClass();// clazz.getMethods(); Method[] methods = clazz.getDeclaredMethods(); for (Method method : methods) { if (method.isAnnotationPresent(PermissionHelper.class)) { PermissionHelper annotation = method.getAnnotation(PermissionHelper.class); if (permissionResult == annotation.permissionResult() && annotation.requestCode() == requestCode) { try { method.setAccessible(true); method.invoke(activity); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } break; } } } }}
如上所示,APP只要在自己编写的BaseActivity里面编写好权限检查,onRequestPermissionsResult里面调用一次injectActivity方法就够了
public class BaseActivity extends Activity { private final String TAG = BaseActivity.class.getSimpleName(); private int permissionRequestCode = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } public boolean checkPermission(String permission, int requestCode) { if (PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(this, permission)) { return true; } else { permissionRequestCode = requestCode; ActivityCompat.requestPermissions(this, new String[]{permission}, requestCode); return false; } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { Log.i(TAG, " == onRequestPermissionsResult == "); if (grantResults.length > 0 ) { PermissionUtils.injectActivity(this, grantResults[0] == PackageManager.PERMISSION_GRANTED, permissionRequestCode); } }}
3 . 实例
调用拍照权限
public class TestActivity extends BaseActivity { private final int PERMISSION_CAMERA = 100; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(checkPermission(Manifest.permission.CAMERA, PERMISSION_CAMERA)){ toDoThing(); } } @PermissionUtils.PermissionHelper(permissionResult = true, requestCode = PERMISSION_CAMERA) private void toDoThing(){ }}
4 . 需要优化之处
1)加注解时必须是不参数的method
2)不能对多个权限进行统一设置
阅读全文
0 0
- Android 注解实现权限管理 APP不再对onRequestPermissionsResult进行操作
- Android M 权限管理拿不到OnRequestPermissionsResult的回调
- android 6.0权限,onRequestPermissionsResult回调不执行
- android运行时权限onRequestPermissionsResult不执行的问题
- svn对项目权限进行管理
- 使用svn对项目权限进行管理
- svn对项目权限进行管理
- 使用sudo对用户进行权限管理
- 采用JPA对Hibernate进行注解操作
- 注解方式实现aop权限管理
- android 对activity进行管理
- android 实现一个ContentProvider对多张表进行操作
- android实现对PDF进行签名、涂鸦操作
- android对app进行代码混淆
- Mac下对Android app进行反编译
- Android 对APP内存管理分析
- linux对多个用户或多个组进行权限管理
- linux对多个用户或多个组进行权限管理
- 考研党 数据结构(严蔚敏)List基本操作(纯C语言,与教材一致)
- redis的主从复制,读写分离,主从切换
- java开发系统内核:使用C语言开发系统应用程序
- js高级程序-url处理
- 欢迎使用CSDN-markdown编辑器
- Android 注解实现权限管理 APP不再对onRequestPermissionsResult进行操作
- 多线程编程---线程死锁
- Kotlin让属性只能被赋值一次且不能为空
- 总结HTML中不经常使用的标签
- 父类子类指针相互转换问题
- Tick与GraphTask
- github Permission denied (publickey). fatal: Could not read from remote repository.
- python写算法题:leetcode: 22. Generate Parentheses
- 初次接触到react-native,遇到的两个失误