作为一个app,target是固定的一个,不用担心是否使用动态权限。但是作为一个sdk可就不那么明朗了,sdk提供给开发者使用,开发者根据自己的应用选择target,sdk就要考虑适配和兼容,那么接下来这里就给出下适配23以上和以下的权限代码,使用反射就可以了,但是注意权限不要使用v4里面的ActivityCompat,因为你不知道开发者是否使用了v4包,也不知道v4包的版本不同对该类是否有影响,所以这里我选择使用Activity里面的现有的权限检查,Activity里面有权限检查也是在target为23的Activity里,因此做下版本判断即可,不然就反射不到喽~
检查权限和请求权限代码,使用Activity自身的方法
检查权限和请求权限的代码,Activity的此方法只在target>=23的时候有
//检查权限
activity.checkSelfPermission(permission);
//请求权限
activity.requestPermissions(permissions,requestCode);
检查权限方法反射
public static int checkSelfPermission_self(Activity activity,String permission){
Log.d(TAG," checkSelfPermission_self start ");
if (Build.VERSION.SDK_INT > 22) {
Class clazz = null;
try {
// activity.checkSelfPermission(permission);
// clazz = Class.forName(activity.getClass().getCanonicalName());
ClassLoader classLoader = activity.getClassLoader();
clazz = classLoader.loadClass(activity.getClass().getCanonicalName());
Log.d(TAG," clazz: "+clazz);
Method checkSelfPermission = clazz.getMethod("checkSelfPermission",String.class);
Log.d(TAG," method: "+checkSelfPermission);
checkSelfPermission.setAccessible(true);
Object result = checkSelfPermission.invoke(activity, permission);
int code = (Integer) result;
Log.d(TAG," code: "+code);
return code;
} catch (Exception e){
e.printStackTrace();
Log.d(TAG," ex: "+e.toString());
}
}
return -999;
}
请求权限方法反射
public static void requestPermission_self(Activity activity,String[] permissions,int requestCode){
Log.d(TAG," requestPermission_self satrt ");
if (Build.VERSION.SDK_INT > 22) {
Class clazz = null;
try {
// activity.requestPermissions(permissions,requestCode);
ClassLoader classLoader = activity.getClassLoader();
clazz = classLoader.loadClass(activity.getClass().getCanonicalName());
// clazz = Class.forName(activity.getClass().getCanonicalName());
Class[] cArg = new Class[2];
cArg[0] = String[].class;
cArg[1] = int.class;
Method checkSelfPermission = clazz.getMethod("requestPermissions",cArg);
Log.d(TAG," method: "+checkSelfPermission);
checkSelfPermission.setAccessible(true);
checkSelfPermission.invoke(activity, permissions,requestCode);
} catch (Exception e){
e.printStackTrace();
Log.d(TAG," requestPermission_self eee: "+e.toString());
}
}
Log.d(TAG," requestPermission_self end ");
}
注意
这里没有权限回调,所以需要自己主动去查询,我在代码中使用的是轮询,如果有好的方法,评论里见哦~