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
原创粉丝点击