Android 注解实现权限管理 APP不再对onRequestPermissionsResult进行操作

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)不能对多个权限进行统一设置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值