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